代码之家  ›  专栏  ›  技术社区  ›  user6646922

向CmakeList添加编译器标志。txt

  •  5
  • user6646922  · 技术社区  · 7 年前

    我想使用最新版本的Boost library,并在 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_CXX_FLAGS ? 我想我可能得具体说明一下 CMAKE_EXE_LINKER_FLAGS 相反,但这样做毫无帮助。

    2 回复  |  直到 6 年前
        1
  •  15
  •   Angew is no longer proud of SO    7 年前

    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,则可以替换硬编码版本 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)
    

    建议是,并非所有编译器都以相同的方式表达“使用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
    
        2
  •  2
  •   joe_chip    7 年前

    一般来说,应该使用 target_link_libraries 而不是直接覆盖链接器标志。


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

    add_executable (first first.cpp)
    
    find_package(Threads REQUIRED)
    target_link_libraries(first PRIVATE Threads::Threads)
    

    Threads::Threads 上面是系统的线程库。这具有跨平台的优势——当你想在Windows上编译你的项目时,链接器不会抱怨未知 pthread 图书馆

    出于同样的原因,最好像@Angew在他们的答案中那样设置C++版本——它只起作用,无需手动调整每个编译器的标志。