【问题标题】:Conditionally finding dependencies of shared library in CMake在 CMake 中有条件地查找共享库的依赖项
【发布时间】:2019-01-20 12:25:34
【问题描述】:

在 Linux 中,我有一个共享库 somelib.so,可以选择针对其他几个共享库进行编译,例如 dep1dep2。现在我正在编写一个使用somelib 的客户端应用程序,但如果somelib 是用dep1dep2 编译的,或者直到我得到一个链接器错误,我现在不会提前。

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

IF somelib DEPEND ON dep1 THEN...

【问题讨论】:

  • 您可以使用try_compile() 构建一个使用somelib.so 的测试应用程序,看看它是否在没有任何额外libs 的情况下构建。您可以考虑在构建 somelib.so 时创建一个配置文件,该配置文件可以导入到新项目中,以便在使用库时了解链接依赖关系。

标签: linux cmake dependencies shared-libraries


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 2012-04-05
    相关资源
    最近更新 更多