2017-04-13 73 views
0

所以我對CLion和CMake很陌生,所以對於術語的錯誤使用提前抱歉。我遇到以下問題:在我的cmake項目中包含了傳感器庫clion

在我的項目中,我想包括ITensor library,它本質上是一個非CMake項目。我把git克隆到我的電腦上並構建了ITensor項目。接下來,我想用它在另一個項目中鏈接到的它的CMake:

我的代碼在main.cpp中

#include <iostream> 
#include "itensor.h" 

int main() { 
    std::string some_string = "Hello world"; 
    return 0; 
} 

和我的CMakeLists.txt樣子:

cmake_minimum_required(VERSION 3.6) 
project(tutorial) 

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 


set(ITENSOR_DIR PATH/TO/ITENSOR) 
include_directories(ITENSOR_DIR/itensor) 

set(SOURCE_FILES 
     main.cpp 
     ${ITENSOR_DIR}/itensor/itensor.h 
     ${ITENSOR_DIR}/itensor/itensor.cc) 

add_executable(tutorial ${SOURCE_FILES}) 

不幸的是,該項目的'教程'不構建在CLion。同樣,CLion無法解析依賴關係itensor.h。 任何人爲什麼這是一個想法,分別如何解決它?

回答

0

我解決這個問題得到了與下面的main.cpp:

#include <iostream> 
#include "itensor/itensor.h" 

int main() { 
    std::string some_string = "Hello world"; 
    return 0; 
} 

而下面的CMakeLists.txt:

project(tutorial) 
cmake_minimum_required(VERSION 3.6) 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 

#Bring the headers into the project 
include_directories(/home/tom/Documents/workspace/ITensor/) 

#Link the library 
add_library(itensor STATIC IMPORTED) 
set_property(TARGET itensor PROPERTY IMPORTED_LOCATION /home/tom/Documents/workspace/ITensor/lib/libitensor.a) 

set(SOURCE_FILES main.cpp) 
add_executable(tutorial ${SOURCE_FILES}) 

凡路徑ITensor可以是相對的(使用$ {PROJECT_SOURCE_DIR}變量)或絕對,如我所示。

+0

嗨托馬斯,太棒了!感謝您的快速回復!現在它似乎工作(這意味着我得到了另一個錯誤,但這次是與lapack關聯,所以不再涉及這篇文章:))。 只是我認爲你將CMakeLists.txt中的「project(tutorial)」行換成了main.cpp(可能只是複製粘貼到帖子中)? –

1

在嘗試Thomas5631的解決方案後,編譯運行到與lapack鏈接問題。我通過添加一些標誌來解決這個問題,但我不確定是否所有標誌都是必需的。

我的CMakeLists.txt:

cmake_minimum_required(VERSION 3.6) 
project(my_project) 
#Bring the headers into the project (full or relative path) 
include_directories(itensor) 

#Link the Itensor library 
add_library(itensor STATIC IMPORTED) 
set_property(TARGET itensor PROPERTY IMPORTED_LOCATION /home/david/my_project/itensor/lib/libitensor.a) 

#Set a variable with all the new flags 
set(ITENSOR_FLAGS "-DPLATFORM_lapack -D__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES=0") 
set(ITENSOR_LINK_FLAGS "-DPLATFORM_lapack -L/home/david/my_project/itensor/lib -litensor -lpthread -L/usr/lib -lblas -llapack") 

#Append the new flags 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 ${ITENSOR_FLAGS}") 

add_executable(my_project main.cpp) 
target_link_libraries(my_project itensor "${ITENSOR_LINK_FLAGS}") 

動機:在文件夾itensor/project_template有一個範例程序,其是足夠簡單以make(從終端)進行編譯。彙編的輸出顯示標誌:

g++ -m64 -std=c++11 -c -I. -I/home/david/my_project/itensor -I/usr/include -O3 -DNDEBUG -Wall -DPLATFORM_lapack -D__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES=0 -Wno-unused-variable -o myappname.o myappname.cc 

[... some warnings ...] 

g++ -m64 -std=c++11 -c -I. -I/home/david/my_project/itensor -I/usr/include -O3 -DNDEBUG -Wall -DPLATFORM_lapack -D__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES=0 -Wno-unused-variable -o myclass.o myclass.cc 
g++ -m64 -std=c++11 -I. -I/home/david/my_project/itensor -I/usr/include -O3 -DNDEBUG -Wall -DPLATFORM_lapack -D__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES=0 -Wno-unused-variable myappname.o myclass.o -o myappname -L/home/david/my_project/itensor/lib -litensor -lpthread -L/usr/lib -lblas -llapack 
+0

不錯的一個!這也消除了我與Lapack的問題! –