1

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

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

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

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

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

谢谢。

编辑:

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

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

4

2 回答 2

4

该符号是由 glibc (C 库)而不是 GCC 定义的,因此-static-libgcc没有任何帮助,因为它只影响libgccnot 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指令导致任何引用memcpy绑定到符号memcpy@GLIBC_2.2.5而不是默认值,memcpy@GLIBC_2.14在您的情况下。

于 2012-07-18T16:36:33.197 回答
3

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

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

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

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

于 2012-07-25T15:47:20.497 回答