使用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 )。
和STATIC_LIBRARY_FLAGS http://www.cmake.org/cmake/help/v2.8.8/cmake.html#prop_tgt:STATIC_LIBRARY_FLAGS
对于静态库
使用“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
)