【问题标题】:How can I build a shared library that will be used for different g++ version?如何构建将用于不同 g++ 版本的共享库?
【发布时间】:2012-07-16 10:18:57
【问题描述】:

我想为其他开发人员编译一个共享库,但不提供源代码。 我针对 g++ 4.6 构建的 .so 文件,但他们使用的是 g++ 4.4。 当他们与我的 .so 文件链接时,g++ 报告:未定义对 'memcpy@GLIBC_2.14' 的引用。

我认为有两种可能的解决方案:

  1. 我重建了不依赖于指定 GLIBC 版本的共享库。

  2. 告诉他们一种简单的方法来链接我的共享库,并使用一些编译器选项使其工作。

我不知道这两种方法,我怎样才能实现这些解决方案或其中之一?

谢谢。

编辑:

我找到了一个链接标志:-static-libgcc

如果我使用此选项构建共享库,这有帮助吗?有什么缺点吗?

【问题讨论】:

  • 您正在考虑 glibc,而不是 glib - 请参阅 this question
  • 不是g++版本,是libc版本。我在 Ubuntu 10.04.4 LTS 上只有 memcpy@GLIBC_2.0,所以我也会得到未定义的引用。可以链接到最古老的 glibc。

标签: g++ version shared glibc


【解决方案1】:

该符号是由 glibc(C 库)而不是 GCC 定义的,所以 -static-libgcc 不会有丝毫帮助,因为它只影响 libgcc 而不是 libc

你可以强制编译器和链接器像这样使用旧的memcpy 符号(我假设你在 x86_64 上编译,所以他们使用的旧 glibc 可能只有memcpy@GLIBC_2.2.5,如果你'重新在 x86 上,那么您可能需要memcpy@GLIBC_2.0):

__asm__(".symver memcpy,memcpy@GLIBC_2.2.5");
memcpy(tgt, src, n);

.symver directive 导致对 memcpy 的任何引用绑定到符号 memcpy@GLIBC_2.2.5 而不是默认值,在您的情况下为 memcpy@GLIBC_2.14

【讨论】:

    【解决方案2】:

    最后,我添加了这些选项,使其不依赖任何共享库。

    -static-libgcc -static-libstdc++ -nodefaultlibs -shared -fPIC
    

    ldd 报告“静态链接”,并且没有任何必需的 .so 文件。

    这可能对任何想要发布可移植共享库的人有用。

    【讨论】:

    • 我非常怀疑你在这里所做的事情的正确性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    相关资源
    最近更新 更多