使用 CMake 打开链接器标志

发布于 2024-09-15 03:50:00 字数 201 浏览 1 评论 0 原文

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

如何修改链接器标志?

When generating VS2010 targets with CMake, I would like the /LTCG flag turned on (only for release + releasewithdebinfo if possible, but its okay if its on for debug builds). How do I modify the linker flags? add_definitions() doesn't work because that only modifies compiler flags. And yes, I have wrapped it in if(MSVC).

How do I modify the linker flags?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

甜宝宝 2024-09-22 03:50:00

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

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

  • CMAKE_EXE_LINKER_FLAGS< /code>
  • CMAKE_SHARED_LINKER_FLAGS
  • CMAKE_MODULE_LINKER_FLAGS

(感谢 Cmake.org)。

You can modify the linker flags in MSC using #pragma comment(linker, ...)

However, if you'd like to do it in the build process with cmake, here are the names you need to know:

  • CMAKE_EXE_LINKER_FLAGS
  • CMAKE_SHARED_LINKER_FLAGS
  • CMAKE_MODULE_LINKER_FLAGS

(Thanks to Cmake.org).

傲世九天 2024-09-22 03:50:00

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

CMAKE_EXE_LINKER_FLAGS
CMAKE_MODULE_LINKER_FLAGS
CMAKE_SHARED_LINKER_FLAGS
CMAKE_STATIC_LINKER_FLAGS

可以使用 ucm 链接器标志的 nofollow">ucm_add_linker_flags 宏

也可以基于每个目标进行管理- 通过使用 target_link_libraries 并使用 传递标志 - 在它们前面(但不带有 -l - 它将被视为链接库而不是链接标志)。

For adding linker flags - the following 4 CMake variables:

CMAKE_EXE_LINKER_FLAGS
CMAKE_MODULE_LINKER_FLAGS
CMAKE_SHARED_LINKER_FLAGS
CMAKE_STATIC_LINKER_FLAGS

can be easily manipulated for different configs (debug, release...) with the ucm_add_linker_flags macro of ucm

linker flags can also be managed on a per-target basis - by using target_link_libraries and passing flags with a - in front of them (but not with a -l - that would be treated as a link library and not a link flag).

夏末 2024-09-22 03:50:00

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

The use of the "ucm" library seems like a nice approach. I rolled a simple macro that help me uniformly manage linker flags in CMake for all configurations while also allowing compiler-specific use. (Just setting the variable can cause flags to stack up when CMake is configured multiple times.)

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()

Other compilers are then supported by creating a compiler-specific macro that checks for the compiler to be in use. That makes it harder to set the right flag on the wrong compiler.

if(CMAKE_COMPILER_IS_GNUCXX)

and

if(${CMAKE_CXX_COMPILER_ID} STREQUAL Clang)
站稳脚跟 2024-09-22 03:50:00

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

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

请注意,由于我使用的是 APPEND_STRING,因此我在标志前添加了一个空格)

You can add linker flags for a specific target using the LINK_FLAGS property:

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

(note that I added a space before the flag since I'm using APPEND_STRING)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文