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

C++ 将编译器标志添加到CMakeLists.txt,c++,boost,cmake,pthreads,C++,Boost,Cmake,Pthreads,我想使用最新版本的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} -lpt

我想使用最新版本的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)
因此,我不断收到以下链接器错误:

未定义对'pthread_detach'的引用

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

g++ foo.cpp -std=c++11 -DBOOST_ERROR_CODE_HEADER_ONLY -lpthread
它很好用


问题是如何使用CMake使其工作。当我通过设置
CMAKE\u CXX\u flags
指定编译器标志时,为什么它不起作用?我想我可能必须指定
CMAKE\u EXE\u LINKER\u标志
,但这样做毫无帮助。

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)

如果您可以将最低CMake版本要求增加到3.1,您也可以使用本机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

通常,应该使用
target\u link\u libraries
指定库,而不是直接覆盖链接器标志


在这种情况下,您可以采用不同的方式:

add_executable (first first.cpp)

find_package(Threads REQUIRED)
target_link_libraries(first PRIVATE Threads::Threads)
Threads::Threads
以上代表系统的线程库。这具有跨平台的优势——当您想在上编译项目时,例如。GWindows,链接器不会抱怨未知
pthread


同样的原因,设置C++版本的Angew方式在他们的答案中是优选的——它只是工作,而不必手动调整每个编译器的标志。另外,从CGEASE 3.8开始,可以做:<代码> TAGEL编译程序(第一个公共CXXYSTD11)< /C> >设置C++标准。这样,首先依赖于

的目标将自动使用C++11标志构建。