代码之家  ›  专栏  ›  技术社区  ›  Clark Gaebel

使用CMake打开链接器标志

  •  20
  • Clark Gaebel  · 技术社区  · 14 年前

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

    如何修改链接器标志?

    5 回复  |  直到 14 年前
        1
  •  30
  •   RBerteig Keith Adler    14 年前

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

    但是,如果您想在使用cmake的构建过程中执行此操作,则需要知道以下名称:

    • CMAKE_EXE_LINKER_FLAGS
    • CMAKE_SHARED_LINKER_FLAGS
    • CMAKE_MODULE_LINKER_FLAGS

    (感谢 Cmake.org ).

        3
  •  3
  •   DiB    8 年前

    使用“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
  •  2
  •   kaveish    7 年前

    LINK_FLAGS 属性:

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

    (注意,因为我使用了 APPEND_STRING

        5
  •  1
  •   onqtam    8 年前

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

    CMAKE_EXE_LINKER_FLAGS
    CMAKE_MODULE_LINKER_FLAGS
    CMAKE_SHARED_LINKER_FLAGS
    CMAKE_STATIC_LINKER_FLAGS
    

    可以使用 ucm_add_linker_flags ucm

    链接器标志也可以基于每个目标进行管理-使用 target_link_libraries - 在他们面前(但不是用 -l