首页 > 解决方案 > 在 CMake 中有条件地查找共享库的依赖项

问题描述

在 Linux 中,我有一个共享库somelib.so,可以选择性地针对其他几个共享库进行编译,dep1比如dep2. 现在somelibsomelib正在编写一个使用.dep1dep2

有没有办法使用 CMake 来解决这个问题?我需要类似的东西

IF somelib DEPEND ON dep1 THEN...

标签: linuxcmakedependenciesshared-libraries

解决方案


...使用 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_FLAGSCMAKE_SHARED_LINKER_FLAGS。如果您正在构建可执行文件,您可能还对CMAKE_EXE_LINKER_FLAGS感兴趣。


推荐阅读