使用CMake开启链接器标志

22
当使用CMake生成VS2010目标时,我希望打开/LTCG标志(如果可能的话,仅适用于发布和发布与调试信息,但是对于调试构建打开也可以)。如何修改链接器标志?add_definitions() 不起作用,因为它只能修改编译器标志。是的,我已经将其包装在 if(MSVC) 中。
如何修改链接器标志?
5个回答

31

使用#pragma comment(linker, ...)在MSC中可以修改链接器标志。

但是,如果您想在构建过程中使用cmake进行修改,以下是您需要知道的名称:

  • CMAKE_EXE_LINKER_FLAGS
  • CMAKE_SHARED_LINKER_FLAGS
  • CMAKE_MODULE_LINKER_FLAGS

(感谢Cmake.org)。


2
在最近的CMake版本中,唯一剩下的标志是CMAKE_EXE_LINKER_FLAGS;最好的做法是编辑目标属性(请参见https://dev59.com/G2gt5IYBdhLWcg3w0w3B) - koda
3
我不知道为什么上面的评论有两个赞。请参见https://cmake.org/cmake/help/git-master/variable/CMAKE_SHARED_LINKER_FLAGS.html?highlight=cmake_shared_linker_flags和https://cmake.org/cmake/help/git-master/variable/CMAKE_MODULE_LINKER_FLAGS.html?highlight=cmake_module_linker_flags:这些标志在最近的CMake版本中肯定存在。 - Edward Z. Yang

4

3

如果要添加链接器标志,需要以下4个CMake变量:

CMAKE_EXE_LINKER_FLAGS
CMAKE_MODULE_LINKER_FLAGS
CMAKE_SHARED_LINKER_FLAGS
CMAKE_STATIC_LINKER_FLAGS

可以使用ucmucm_add_linker_flags宏轻松地针对不同配置(调试、发布等)进行操作。
链接器标志也可以按目标进行管理 - 通过使用target_link_libraries并在标志前加上-(但不要加上-l,否则会被视为链接库而不是链接标志)。

3
使用“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)

2
您可以使用 LINK_FLAGS 属性为特定目标添加链接器标志:
set_property(TARGET ${target} APPEND_STRING PROPERTY LINK_FLAGS " ${flag}")

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接