【问题标题】:Linking with cmake, icc and pthreads (linux)与 cmake、icc 和 pthreads (linux) 链接
【发布时间】:2016-11-25 10:04:15
【问题描述】:

我正在尝试使用Intel C++ CompilerCMakestd::threads 支持编译一个简单的测试项目。

如果我这样做:

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})

我正在由icc (compilervars.sh) 提供的脚本设置的环境中构建,并且使用-DCMAKE_C_COMPILER=icc -DCMAKE_CXX_COMPILER=icpc 选项调用CMake。如果我不使用线程,它就可以工作。

我使用 CMake 有什么问题?

谢谢!

【问题讨论】:

  • 我认为你必须先声明可执行文件,然后设置链接库,否则target_link_libraries 不知道可执行文件(在你的情况下为test)和投诉。

标签: c++ linux cmake libraries icc


【解决方案1】:

回顾target_link_libraries 的文档,必须在被使用之前声明一个目标:

命名的<target> 必须已通过add_executable()add_library() 等命令在当前目录中创建

顺便说一句,正如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)

【讨论】:

  • 谢谢。 CMAKE_CXX_STANDARD 标志不适用于具有 CMake 3.5 或更低版本的英特尔编译器,并且在我使用 CMake 的发行版上是 3.5.1
【解决方案2】:

顺序不对:先声明你的可执行文件,让CMake知道它存在

add_executable (${PROJECT_NAME} ${SOURCE_LIST})

然后添加链接库

TARGET_LINK_LIBRARIES(${PROJECT_NAME} pthread)

来自target_link_libraries 的文档:

name 必须是由 add_executable() 或 add_library() 等命令在当前目录中创建的

【讨论】:

    猜你喜欢
    • 2017-01-06
    • 1970-01-01
    • 2021-12-02
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多