自动将链接选项添加到共享库的依赖项

时间:2019-07-15 12:00:44

标签: cmake linker linker-flags

假设我有一个共享库A,还有一个与之链接的其他库B。它们在两个单独的项目中。

在我当前的设置中,为了使A的功能能够正常工作,B需要向其链接器选项中添加-rdynamic,如下所示:

target_link_libraries(B -rdynamic)

问题是A可能有很多依赖项,因此必须为每个变量明确包含上面的行,这很麻烦。

A是否有办法让其所有依赖项自动使用-rdynamic


编辑:这是我的情况的详细说明。

我有一个共享库mylib不能是静态库。它是在同名的CMake项目中定义的。

mylib
├── CMakeLists.txt
└── src
    └── ...

它的CMakeLists.txt看起来像这样:

# mylib/CMakeLists.txt
project(mylib)
...
add_library(mylib SHARED ${SOURCES})
...

在单独的项目中,存在client_i可执行文件,它们使用/链接到mylib,有时是间接使用(即链接到链接到mylib的东西)。

client_0
├── CMakeLists.txt
└── src
    └── ...
client_1
├── CMakeLists.txt
└── src
    └── ...
client_2
├── CMakeLists.txt
└── src
    └── ...
...

其中一个CMakeLists.txt如下:

# client_i/CMakeLists.txt
project(client_i)
...
add_executable(client_i ${SOME_OTHER_SOURCES})
target_link_libraries(client_i mylib -rdynamic)
...

请注意-rdynamic。如果没有此选项,则mylib提供的某些功能将无法使用。我需要它。

我的问题是可能有成千上万的{{​​1}}个不同的client_i,每个mylib的不同用户/用户在自己的项目中定义了这些,我提供了这些(以及可以用作二进制文件。

我想避免必须将-rdynamic添加到每个client_i中,因为有些用户可能不知道(因为它可能是间接使用的),所以有些人可能会忘记它,这可能会导致头痛等。

理想情况下,CMakeLists.txt的{​​{1}}如下所示:

mylib

# mylib/CMakeLists.txt project(mylib) ... add_library(mylib SHARED ${SOURCES}) target_link_libraries(mylib -rdynamic) ... client_i就是:

CMakeLists.txt

它的链接器选项中将包含# client_i/CMakeLists.txt project(client_i) ... add_executable(client_i ${SOME_OTHER_SOURCES}) target_link_libraries(client_i mylib) ... 。但是我已经尝试过了,它不是似乎可行。

2 个答案:

答案 0 :(得分:2)

这是您可以尝试的简单解决方案:

# Get a list of A's direct library dependencies.
get_target_properties(LIB_DEPENDENCIES A LINK_LIBRARIES)

# Loop through each library, adding the link option to each.
foreach(LIB ${LIB_DEPENDENCIES})
    target_compile_options(${LIB} PRIVATE "-rdynamic")
endforeach()

可以将其扩展为类似于链接到here的@KamilCuk的答案,以解决静态/共享/导入的库以及取决于依赖项的多样性和复杂性的递归。

答案 1 :(得分:0)

AB在不同的项目中时,如何将AB链接起来?

如果A是与B不同的项目,则您必须export打包A并在项目B中使用find_package找到AHere是一个很好的教程,展示了用例。