CMake和共享库的顺序相关链接

CMake and order dependent linking of shared libraries

本文关键字:链接 顺序 共享 CMake      更新时间:2023-10-16

我有一些小组件,我正在为我的主应用程序构建共享库。让我们以libalibb为例。每个都在自己的子目录中构建,如下所示:

add_library(liba SHARED a.cpp)

然后,在根项目文件夹中,我需要将我的主应用程序链接到这两个文件夹。

include_directories(a)
include_directories(b)
add_executable(dummy dummy.cpp)
target_link_libraries(dummy a b)

CMake运行良好,我的应用程序进行了编译,但未能链接。问题是b引用了a。如果我在链接为时提供库的顺序

target_link_libraries(dummy b a)

该程序编译并链接刚刚好的

当这种系统开始涉及更复杂的库间依赖关系时,即使依赖关系是非循环的,也开始变得不可能。如何管理此处的链接步骤?在CMake中为链接排序库有技巧吗?

您可以通过添加来指定ab之间的关系

target_link_libraries(b a)


来自文档:

库依赖项在默认情况下是可传递的。当这个目标链接到另一个目标时,链接到这个目标的库也会出现在另一目标的链接线上。

因此,如果您以这种方式将a指定为b的依赖项,您甚至不需要在任何依赖于b的目标中显式列出a,即您的另一个命令可以只是:

target_link_libraries(dummy b)

尽管列出CCD_ 9也不会造成任何损害。

一个简单的解决方案(尤其是对于循环依赖项)可以是将所有库放在一个列表变量中,然后添加该列表两次(如果需要,可以添加更多),如:

set(LINK_LIBS "liba libb libc")
target_link_libraries(app ${LINK_LIBS} ${LINK_LIBS})

(或者只需在target_link_libraries功能中依次键入两次列表)

这对我来说已经奏效了好几次,但我承认,可能还有一些我不知道的缺点(除了看起来有点像黑客)。