使用CMake打开链接器标志

当使用CMake生成VS2010目标时,我希望/ LTCG标志打开(如果可能的话,仅用于发布+ releasewithdebinfo,但是如果它打开调试则可以)。 如何修改链接器标志? add_definitions()不起作用,因为它只修改编译器标志。 是的,我把它包裹在if(MSVC)中。

如何修改链接器标志?

您可以使用#pragma comment(链接器,…)修改MSC中的链接器标志

但是,如果您想在使用cmake的构建过程中执行此操作,请输入以下名称:

  • CMAKE_EXE_LINKER_FLAGS
  • CMAKE_SHARED_LINKER_FLAGS
  • CMAKE_MODULE_LINKER_FLAGS

(感谢Cmake.org )。

使用“ucm”库似乎是一个很好的方法。 我推出了一个简单的宏,它帮助我在CMake中统一管理所有配置的链接器标志,同时还允许编译器特定的使用。 (只需设置变量就可以在多次配置CMake时导致标记堆叠。)

 macro(ADD_MSVC_LINKER_FLAG flag) if(MSVC) if(${CMAKE_EXE_LINKER_FLAGS} MATCHES "(${flag}.*)") # message("skipping linker flags") else() set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${flag}" CACHE STRING "Linker Flags for Release Builds" FORCE) endif() if(${CMAKE_SHARED_LINKER_FLAGS} MATCHES "(${flag}.*)") # message("skipping linker flags") else() set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${flag}" CACHE STRING "Linker Flags for Release Builds" FORCE) endif() if(${CMAKE_STATIC_LINKER_FLAGS} MATCHES "(${flag}.*)") # message("skipping linker flags") else() set(CMAKE_STATIC_LINKER_FLAGS "${CMAKE_STATIC_LINKER_FLAGS} ${flag}" CACHE STRING "Linker Flags for Release Builds" FORCE) endif() if(${CMAKE_MODULE_LINKER_FLAGS} MATCHES "(${flag}.*)") # message("skipping linker flags") else() set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${flag}" CACHE STRING "Linker Flags for Release Builds" FORCE) endif() endif() endmacro() 

然后通过创建特定于编译器的宏来检查其他编译器,该宏检查正在使用的编译器。 这使得在错误的编译器上设置正确的标志变得更加困难。

 if(CMAKE_COMPILER_IS_GNUCXX) 

 if(${CMAKE_CXX_COMPILER_ID} STREQUAL Clang) 

用于添加链接器标志 – 以下4个CMake变量:

 CMAKE_EXE_LINKER_FLAGS CMAKE_MODULE_LINKER_FLAGS CMAKE_SHARED_LINKER_FLAGS CMAKE_STATIC_LINKER_FLAGS 

可以使用ucm_add_linker_flags宏来轻松操作不同的配置(调试,释放…)

链接器标志也可以在每个目标的基础上进行管理 – 通过使用target_link_libraries并在其前面传递带有-标志(但不包含-l – 将被视为链接库而不是链接标志)。

您可以使用LINK_FLAGS属性为特定目标添加链接器标志:

 set_property(TARGET ${target} APPEND_STRING PROPERTY LINK_FLAGS " ${flag}") 

(注意我在标志之前添加了一个空格,因为我正在使用APPEND_STRING