gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 19:51:16 25 4
gpt4 key购买 nike

我想使用最新版本的 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)

我不断收到以下链接器错误:

undefined reference to `pthread_detach

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

g++ foo.cpp -std=c++11 -DBOOST_ERROR_CODE_HEADER_ONLY -lpthread

它工作正常。

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

最佳答案

CMake 对您试图通过显式标志规范解决的所有问题提供 native 支持,因此您应该改用它:

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)

如果您可以将最低 CMake 版本要求 boost 到 3.1,您也可以用 native CMake 替换硬编码的 std 标志:

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)

优点是并非所有编译器都以相同的方式表达“使用 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

关于c++ - 将编译器标志添加到 CMakeLists.txt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50545214/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com