cmake - 全局链接器标志设置(适用于目录中的所有目标)

时间:2015-09-21 15:05:12

标签: c++ linker cmake

我想将链接器标志传递给项目中的所有子项目(子目录CMakeList)。

在切换到新的cmake 3.3之前,我使用了以下代码(cmake 3.2),它运行良好,为编译和链接添加了标志:

set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -stdlibc++")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -stdlibc++")

使用cmake 3.3,这不再起作用,只为编译步骤设置标志。我更新了CMakeList以使用更多"现代" cmake语法:

set(MY_DEBUG_OPTIONS -g -stdlib=libstdc++ -Wfatal-errors)
set(MY_RELEASE_OPTIONS -O3 -stdlib=libstdc++ -Wfatal-errors)

add_compile_options(
  "$<$<CONFIG:DEBUG>:${MY_DEBUG_OPTIONS}>"
  "$<$<CONFIG:RELEASE>:${MY_RELEASE_OPTIONS}>")

这个为所有子项目设置的编译标志,是否有类似的方式为链接器标志执行此操作?我知道可以使用target_link_libraries命令在目标基础上添加链接器标志,但无法找到其他任何内容。

我尝试使用CMAKE_SHARED_LINKER_FLAGS(以及相应的var for exe,module,..)变量但没有成功。

更新:

事实证明,这与cmake版本无关,除了第一个make命令外,它与CMAKE_CXX_FLAGS_XXX变量一起正常工作。如果第二次运行make(在CmakeList中进行修改),则会出现标记。

我认为我在使用简单的CMakeList进行测试时找到了一个解决方案:如果在project命令之后声明了标志,它就会按预期工作。我不知道这是cmake本身的要求还是仅仅是一种奇怪的行为。

cmake_minimum_required (VERSION 3.2)

set(PROJECT Test_Project)

# Not working (on first run)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -stdlib=libstdc++ -Wfatal-errors")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g -stdlib=libstdc++ -Wfatal-errors")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -stdlib=libstdc++ -Wfatal-errors")

project(${PROJECT})

# Declare here instead...

add_executable(Test test.cpp)

MESSAGE( STATUS "Config flags : " ${CMAKE_CXX_FLAGS_RELEASE})

使用:

cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release .

0 个答案:

没有答案