Gcc 仅将链接器标志添加到CMake中的特定库
假设我有一个名为exec的最终可执行文件,我需要将它与两个共享库(libA和libB)链接起来。对于libA,我希望传递一些链接器标志,我不希望传递另一个库 这就是我的简化CMakeLists.txt文件目前的样子:Gcc 仅将链接器标志添加到CMake中的特定库,gcc,cmake,clang,Gcc,Cmake,Clang,假设我有一个名为exec的最终可执行文件,我需要将它与两个共享库(libA和libB)链接起来。对于libA,我希望传递一些链接器标志,我不希望传递另一个库 这就是我的简化CMakeLists.txt文件目前的样子: add_executable(exec main.cpp ) target_link_libraries(exec PRIVATE libA libB ) target_link_options(exec PRIVATE "-Wl,--no
add_executable(exec
main.cpp
)
target_link_libraries(exec
PRIVATE
libA
libB
)
target_link_options(exec PRIVATE "-Wl,--no-as-needed")
现在,CMake将把它当作我通过了——两个库都没有必要的选项
我想实现这个非常严格的命令:
-Wl,-no-as-needed -llibA -Wl,-as-needed -llibB
据我所知,CMake不保证库将按照它们在目标链接库中写入的顺序传递给链接器,因为如果它是由依赖性导致的,则顺序可能会更改,因此我无法写入:
target_link_libraries(exec
PRIVATE
"-Wl,-no-as-needed"
libA
"-Wl,-as-needed"
libB
)
您的假设是正确的,CMake不能保证链接器标志的顺序。此外,重复条目仅使用一次 要解决此问题,您可以使用而不是
target\u link\u librares
与SHELL:
前缀组合使用。此前缀允许您创建一组链接器标志,这些标志不会更改组内的顺序
如果libA是一个CMake目标,那么它将变得更加复杂,在这种情况下,target\u link\u库(exec PRIVATE libA)
将生成比-llibA
更复杂的东西。最直接的解决方案是修改targetlibA
的定义,使其包含带有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
所以我不能写你试过吗?是的,现在它可以工作了,然而,如果依赖项要求以不同的顺序向链接器提供库,这可能会破坏事情。当然,我在这里可能是错的,但是我在文档中没有找到任何其他说明。我在文档中没有找到任何内容
,所以您找到了SHELL:
?