如何构建将用于不同g ++版本的共享库?

时间:2012-07-17 13:21:59

标签: g++ version shared glibc

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

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

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

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

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

    感谢。

    修改

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

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

2 个答案:

答案 0 :(得分:4)

该符号由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

答案 1 :(得分:3)

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

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

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

对于想要发布便携式共享库的人来说,这可能很有用。