Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gcc 仅将链接器标志添加到CMake中的特定库_Gcc_Cmake_Clang - Fatal编程技术网

Gcc 仅将链接器标志添加到CMake中的特定库

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

假设我有一个名为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-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
更复杂的东西。最直接的解决方案是修改target
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
所以我不能写
你试过吗?是的,现在它可以工作了,然而,如果依赖项要求以不同的顺序向链接器提供库,这可能会破坏事情。当然,我在这里可能是错的,但是我在文档中没有找到任何其他说明。
我在文档中没有找到任何内容
,所以您找到了
SHELL: