CMake和共享库的顺序相关链接
CMake and order dependent linking of shared libraries
我有一些小组件,我正在为我的主应用程序构建共享库。让我们以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中为链接排序库有技巧吗?
您可以通过添加来指定a
和b
之间的关系
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
功能中依次键入两次列表)
这对我来说已经奏效了好几次,但我承认,可能还有一些我不知道的缺点(除了看起来有点像黑客)。
相关文章:
- CMake-按正确顺序将项目与C运行时对象文件链接
- libavdevice 和 x11 的静态链接库应该以什么顺序链接?
- 链接库时的默认目录上的GCC或G 路径搜索顺序
- 编写链接函数的更短/更有效的方法,该函数按字典顺序添加新元素
- 双链表中按字母顺序排序的链接
- 为什么更改链接顺序可以修复一个系统上的一些链接错误?
- 链接列表并按字母顺序插入字符串
- 队列顺序中的链接列表
- AC_LANG_PROGRAM由于链接器选项的顺序失败了链接阶段
- 如何确定最快的链接顺序
- 通过Microsoft Visual Studio 2010 IDE 进行精确的库链接顺序控制
- 没有调用C++析构函数,具体取决于链接顺序
- 不同库中的相同符号和链接顺序
- 库的链接顺序问题
- 如何在忽略链接顺序的情况下链接源
- 为什么使用内联函数的程序根据链接顺序和参数具有不同的行为
- 绕过 gcc 中的静态链接顺序问题
- 在Qt Android项目中使用OpenCV时的链接顺序
- 是否可以在 cmake 中更改库链接顺序
- avcodec_alloc_context引用未定义,但ffmpeg链接顺序正确