假设我有一个共享库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)
...
。但是我已经尝试过了,它不是似乎可行。
答案 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)
A
和B
在不同的项目中时,如何将A
与B
链接起来?如果A
是与B
不同的项目,则您必须export打包A
并在项目B
中使用find_package找到A
。 Here是一个很好的教程,展示了用例。