37

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

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 中进行链接有技巧吗?

4

2 回答 2

37

您可以通过添加来指定a和之间的关系b

target_link_libraries(b a)


文档

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

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

target_link_libraries(dummy b)

尽管列出也不会造成任何伤害a

于 2012-08-30T20:28:33.653 回答
17

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

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

(或者只是在target_link_libraries函数中一个接一个地输入列表两次)

这对我有用很多次,但我承认可能存在一些我不知道的可能缺点(除了看起来有点像黑客之外)。

于 2012-08-30T20:37:29.207 回答