... 使用 somelib 的客户端应用程序,但我现在不提前
如果 somelib 是用 dep1 和 dep2 编译的……我需要类似的东西
IF somelib DEPEND ON dep1 THEN...
在 Linux 上,我相信解决它的方法是使用 LD 链接器选项 -Wl,--exclude-libs,ALL 和 -Wl,--as-needed。
始终包含 -ldep1 和 -ldep2 作为库选项。然后使用-Wl,--as-needed 排除不需要的库。
如果我没记错的话,这个技巧可以追溯到数学库-lm 的 20 或 30 年左右。有时数学符号包含在glibc 中,有时它们包含在-lm 中。所以你总是链接到-lm,并允许链接器用-Wl,--as-needed 丢弃-lm 库。
事实上ld(1) man page 说在使用技巧时要推送和弹出状态:
此选项的一个目标是 pkg-config 的规范。
当与 --libs 选项一起使用时,所有可能需要的库
被列出,然后可能一直链接。它是
最好返回如下内容:
-Wl,--push-state,--as-needed -libone -libtwo -Wl,--pop-state
-Wl,--exclude-libs,ALL 是防止您从-ldep1 和-ldep2 重新导出符号的选项。如果不使用这些库,那么您不需要-Wl,--exclude-libs,ALL。
我相信在构建somelib.so 时,静态库和共享对象的两个 CMake 设置是:
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) man page、CMAKE_MODULE_LINKER_FLAGS 和 CMAKE_SHARED_LINKER_FLAGS。如果您正在构建可执行文件,您可能还对 CMAKE_EXE_LINKER_FLAGS 感兴趣。