【问题标题】:Conditional linking through static library通过静态库进行条件链接
【发布时间】:2013-05-14 23:38:05
【问题描述】:

我正在用 C++ 编写一个大型静态库。在那个库中,我使用了大量静态和动态库中的符号。当我“制作”它时,我不需要链接任何库,因为它是静态的。这是我的问题:我的静态库是非常通用的。它为同一个接口提供了多个实现(您可以看到像 drivers 这样的实现;libA 提供它自己的实现,而 libB 提供它等等)。这些实现不打算一起使用,因为其中一些是平台相关的。

链接到我的库时出现问题。客户端必须链接我的 lib 使用符号的所有库,即使客户端的代码不依赖于任何 lib 符号。例如,如果客户端的代码只依赖于libA,他仍然必须链接到libB,因为我的静态库中有一些来自libB 的符号。

你知道一种方法来排除这种行为,并且只链接到实际使用的库,推断客户端代码中的符号吗?

谢谢。

【问题讨论】:

    标签: c++ linker g++ static-libraries clang++


    【解决方案1】:

    您可能会将您的库与其他库动态链接。尝试链接论文的静态版本。

    【讨论】:

    • 符号可以来自静态动态库,我不能只链接静态。
    【解决方案2】:

    如果我理解正确,您的库正在尝试使用客户端代码预期为 defined 的符号。如果客户的代码没有certain symbols,您希望链接器指向您的库的某些部分not link。对吗?

    如果以上符合您的要求,请考虑http://en.wikipedia.org/wiki/Weak_symbol。我不确定您使用的是哪个工具链,但如果支持的弱符号是实现条件链接的好方法。

    【讨论】:

    • 是的,这就是我想要的。我的静态库有很多静态符号,但我希望它们不要在最终程序中导出(所以我们不在乎它们是否已定义)
    • 不知道clang++是否支持这样的功能?我同时使用 g++ 和 clang++
    • @skp 不确定clang++GNU gcc(and g++) 肯定支持此功能。通过一些谷歌搜索,我相信#pragma weakclang++ 中的相应功能。我建议添加标签 g++ 和 clang++;这将吸引该领域的一些专家发表评论。
    • 但是,如果是这样一个库,强迫它的用户使用一些选择的编译器是不是很好?当我需要使用此类库时,我遇到的情况很少。其中一个需要编译器 A,第二个需要编译器 B。我必须说,我对创建者非常生气。
    • 我的印象是静态库和与该静态库链接的客户端应用程序的每个组合将始终使用相同的工具链。只是客户端应用程序在实现方面有所不同,只需要链接符号的子集。我不希望 g++ 和 clang++ 共存,即使用一个工具链创建的库但与一个应用程序链接是用另一个编译的。我不知道在 clang++ 和 g++ 之间是否允许这样做。
    猜你喜欢
    • 1970-01-01
    • 2015-07-14
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多