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,但这样做根本没有帮助.
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)
| 归档时间: |
|
| 查看次数: |
7390 次 |
| 最近记录: |