将编译器标志添加到CMakeLists.txt

use*_*922 4 c++ boost pthreads cmake

我想使用最新版本的Boost库,并具有以下CMakeLists.txt文件的内容:

cmake_minimum_required (VERSION 3.0)
project (foo)
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -DBOOST_ERROR_CODE_HEADER_ONLY -lpthread")
# set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lpthread")

add_executable (first first.cpp)
Run Code Online (Sandbox Code Playgroud)

有了这个,我不断收到以下链接器错误:

对`pthread_detach的未定义引用

但是,如果我在不使用cmake的情况下编译代码,请使用以下命令:

g++ foo.cpp -std=c++11 -DBOOST_ERROR_CODE_HEADER_ONLY -lpthread
Run Code Online (Sandbox Code Playgroud)

它工作正常.

问题是如何使用cmake使其工作.当我通过设置CMAKE_CXX_FLAGS指定编译器标志时,为什么它不起作用?我想我可能不得不指定CMAKE_EXE_LINKER_FLAGS,但这样做根本没有帮助.

Rei*_*ica 9

CMake对您尝试通过显式标志规范解决的所有事情提供原生支持,因此您应该使用它:

cmake_minimum_required (VERSION 3.0)
project (foo)

add_executable (first first.cpp)
target_compile_options (first PRIVATE -std=c++11)
target_compile_definitions (first PRIVATE BOOST_ERROR_CODE_HEADER_ONLY)
target_link_libraries (first pthread)
Run Code Online (Sandbox Code Playgroud)

如果您可以将最小CMake版本要求增加到3.1,则可以std用本机CMake 替换硬编码标志:

cmake_minimum_required (VERSION 3.1)
project (foo)

add_executable (first first.cpp)
set_target_properties (first PROPERTIES
  CXX_STANDARD 11
  CXX_STANDARD_REQUIRED TRUE
  CXX_EXTENSIONS FALSE
)
target_compile_definitions (first PRIVATE BOOST_ERROR_CODE_HEADER_ONLY)
target_link_libraries (first pthread)
Run Code Online (Sandbox Code Playgroud)

值得一提的是,并非所有编译器都以同样的方式表达"使用没有扩展的C++ 11",而CMake会将需求转换为正确的标志.

如果您需要为许多可执行文件设置相同的C++ 11,则可以设置预填充属性的CMake变量.请注意,必须在创建可执行文件之前设置变量:

set (CMAKE_CXX_STANDARD 11)
set (CMAKE_CXX_STANDARD_REQUIRED TRUE)
set (CMAKE_CXX_EXTENSIONS FALSE)

add_executable (first first.cpp)
target_compile_definitions (first PRIVATE BOOST_ERROR_CODE_HEADER_ONLY)
target_link_libraries (first pthread)

add_executable (second second.cpp)
target_compile_definitions (second PRIVATE BOOST_ERROR_CODE_HEADER_ONLY)
target_link_libraries (second pthread)

# ... and so on
Run Code Online (Sandbox Code Playgroud)

  • 另外,从CMake 3.8开始,可以执行:`target_compile_features(first PUBLIC cxx_std_11)`来设置C++标准.这种依赖于`first`的目标将自动使用C++ 11标志构建. (2认同)