linux - 在 CMake 中有条件地查找共享库的依赖项
问题描述
在 Linux 中,我有一个共享库somelib.so
,可以选择性地针对其他几个共享库进行编译,dep1
比如dep2
. 现在somelib
我somelib
正在编写一个使用.dep1
dep2
有没有办法使用 CMake 来解决这个问题?我需要类似的东西
IF somelib DEPEND ON dep1 THEN...
解决方案
...使用 somelib 的客户端应用程序,但如果 somelib 是用 dep1 和 dep2 编译的,我现在不提前...我需要类似的东西
IF somelib DEPEND ON dep1 THEN...
在 Linux 上,我相信解决它的方法是使用 LD 链接器选项-Wl,--exclude-libs,ALL
和-Wl,--as-needed
.
始终包含-ldep1
和-ldep2
作为库选项。然后-Wl,--as-needed
在不需要时使用排除库。
如果我没记错的话,这个技巧可以追溯到数学库的 20 或 30 年左右-lm
。有时数学符号被包含在其中glibc
,有时它们被包含在-lm
. 因此,您始终链接-lm
并允许链接器丢弃-lm
带有-Wl,--as-needed
.
事实上,ld(1)
手册页说使用技巧时要推送和弹出状态:
此选项的一个目标是 pkg-config 的规范。当与 --libs 选项一起使用时,所有可能需要的库都会被列出,然后可能一直链接。最好返回如下内容:
-Wl,--push-state,--as-needed -libone -libtwo -Wl,--pop-state
-Wl,--exclude-libs,ALL
是防止您从 和 重新导出符号的-ldep1
选项-ldep2
。如果没有使用这些库,那么您应该不需要-Wl,--exclude-libs,ALL
.
我相信构建时静态库和共享对象的两个 CMake 设置somelib.so
是:
set(OUR_LINKER_FLAGS "-Wl,--exclude-libs,ALL -Wl,--as-needed -ldep1 -ldep2")
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${OUR_LINKER_FLAGS}")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${OUR_LINKER_FLAGS}")
另请参阅CMake 文档中的ld(1)
手册页、CMAKE_MODULE_LINKER_FLAGS和CMAKE_SHARED_LINKER_FLAGS。如果您正在构建可执行文件,您可能还对CMAKE_EXE_LINKER_FLAGS感兴趣。
推荐阅读
- mysql - 创建时间戳为同一天的新表
- android - Android Studio Gradle 问题 >> build.gradle': 1: unexpected token: <@line 1, column 1
- asp.net-core - 使用具有散列密码和盐的数据创建种子
- python - 如何处理意外按键
- python - 获取存储在 Python 中的二维列表中的特定字典值的数量
- saml - ITfoxtec SAML 2.0 会话超时
- angular - 如何在 Angular 2 中测试 ViewChildren 的变化
- laravel - 如何从数据库中为laravel中的不同页面动态元标记和元描述?
- node.js - Kafka-node 不断断开并重新连接“Kafka 生产者错误:NestedError refreshBrokenMetadata”
- django - 如何使用django在同一个浏览器中登录多个用户