【问题标题】:Add linker flags only to specific libraries in CMake仅将链接器标志添加到 CMake 中的特定库
【发布时间】:2021-01-02 05:54:07
【问题描述】:

假设我有一个名为 exec 的最终可执行文件,我需要将它与 2 个共享库 - libA 和 libB 链接。对于 libA,我想传递一些链接器标志,而我不希望传递其他库。

这就是我简化的 CMakeLists.txt 文件目前的样子:

add_executable(exec
    main.cpp
)
target_link_libraries(exec
    PRIVATE
    libA
    libB
)
target_link_options(exec PRIVATE "-Wl,--no-as-needed")

现在 CMake 会将其视为我将 --no-as-needed 选项传递给两个库。

我想达到这个非常严格的顺序:

-Wl,-no-as-needed -llibA -Wl,-as-needed -llibB

据我所知,CMake 不保证库会按照它们在 target_link_libraries 中写入的顺序传递给链接器,因为如果依赖关系导致顺序可能会发生变化,因此我无法编写:

target_link_libraries(exec
    PRIVATE
    "-Wl,-no-as-needed"
    libA
    "-Wl,-as-needed"
    libB
)

【问题讨论】:

  • so I cannot write你试过了吗?
  • 是的,现在它可以工作,但是如果依赖项需要以不同的顺序将库提供给链接器,这可能会破坏事情。当然,我可能在这里错了,但是我没有在文档中找到任何其他说明。
  • I did not find anything in documentation 你找到SHELL:了吗?

标签: gcc cmake clang


【解决方案1】:

您认为 CMake 不保证链接器标志的顺序是正确的。此外,重复条目仅使用一次。

要解决这个问题,您可以使用target_link_options 而不是target_link_librares 结合SHELL: 前缀。此前缀允许您创建一组不会更改组内顺序的链接器标志。

如果 libA 是 CMake 目标,它会变得更加复杂,在这种情况下,target_link_libraries( exec PRIVATE libA ) 将生成比 -llibA 更复杂的东西。最直接的解决方案是将目标libA 的定义修改为已经包含带有SHELL: 前缀的标志。但这似乎不是你的情况。

所以解决办法是:

target_link_options( exec PRIVATE "SHELL:-Wl,-no-as-needed -llibA" )
target_link_options( exec PRIVATE "SHELL:-Wl,-as-needed -llibB" )

这可以生成-Wl,-no-as-needed -llibA -Wl,-as-needed -llibB-Wl,-as-needed -llibB -Wl,-no-as-needed -llibA

【讨论】:

    猜你喜欢
    • 2021-12-28
    • 2014-08-23
    • 1970-01-01
    • 2013-07-02
    • 2020-03-12
    • 1970-01-01
    相关资源
    最近更新 更多