2016-11-25 64 views
3

我想編譯一個簡單的測試項目,支持Intel C++ CompilerCMakestd::threads與cmake,icc和pthreads(linux)鏈接

如果我做的:

icpc -std=c++11 -lpthread source/main.cpp 

然後構建和程序做工精細。

但隨着CMake我得到一個錯誤:

CMake Error at CMakeLists.txt:21 (TARGET_LINK_LIBRARIES): 
    Cannot specify link libraries for target "test" which is not built by 
    this project. 

CMakeLists.txt是:

project(test) 
set (CMAKE_CXX_FLAGS "-std=c++11") 
set(SOURCE_LIST "source/main.cpp") 
TARGET_LINK_LIBRARIES(${PROJECT_NAME} pthread) 
add_executable (${PROJECT_NAME} ${SOURCE_LIST}) 

我建立在由icccompilervars.sh)和CMake提供的腳本中設置的環境中調用-DCMAKE_C_COMPILER=icc -DCMAKE_CXX_COMPILER=icpc選項。它工作,如果我不使用線程。

我使用CMake有什麼問題?

謝謝!

+1

我認爲你必須先聲明可執行文件,然後設置鏈接庫,否則'target_link_libraries'不知道可執行文件(在你的情況下是'test')和投訴。 –

回答

2

回想一下target_link_libraries的文檔,tar得到一定之前宣佈使用:

The named <target> must have been created in the current directory by a command such as add_executable() or add_library() .

BTW爲this answer說,你不應該設置CMAKE_CXX_FLAGS明確,而喜歡設置CMAKE_CXX_STANDARD和相關的變量:

project(test) 

set(CMAKE_CXX_STANDARD 11) 
set(CMAKE_CXX_STANDARD_REQUIRED ON) 
set(CMAKE_CXX_EXTENSIONS OFF) 

set(SOURCE_LIST "source/main.cpp") 

add_executable(${PROJECT_NAME} ${SOURCE_LIST}) 

target_link_libraries(${PROJECT_NAME} pthread) 
+0

謝謝。 CMAKE_CXX_STANDARD標誌不適用於CMake 3.5或更低版本的英特爾編譯器,而我使用的CMake的分發版本是3.5.1 – galinette

2

的順序是錯誤的:首先聲明你的可執行文件,並讓CMake的知道它的存在

add_executable (${PROJECT_NAME} ${SOURCE_LIST}) 

事後添加鏈接庫

TARGET_LINK_LIBRARIES(${PROJECT_NAME} pthread) 

target_link_libraries的文檔:

The named must have been created in the current directory by a command such as add_executable() or add_library()