2016-11-25 61 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()