1

假设我有一个共享库,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不起作用。我需要它。

我的问题是可能有成千上万个不同client_i的 s,每个都由我提供的不同人/用户在自己的项目中定义mylib(并且可以用作二进制文件)。

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

理想情况下,CMakeLists.txtformylib看起来像:

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

aclient_i CMakeLists.txt只是:

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

它会-rdynamic在它的链接器选项中。但是我已经尝试过了,它似乎不起作用

4

2 回答 2

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

这可以扩展,类似于答案@KamilCuk 链接here,以考虑静态/共享/导入库和递归,具体取决于依赖项的多样性和复杂性。

于 2019-07-15T13:59:27.007 回答
0

如何链接何时以及A在不同的项目中?BAB

如果A是不同的项目B,则必须导出包并在项目中A使用find_packageB来查找A是一个很好的教程,展示了用例。

于 2019-07-15T20:31:09.350 回答