我想将共享库编译到其他开发人员,但不提供源代码。 我是针对g ++ 4.6构建的.so文件,但是他们使用的是g ++ 4.4。 当他们与我的.so文件链接时,g ++报告:未定义引用'memcpy@GLIBC_2.14'。
我认为有两种可能的解决方案:
我重建了我的共享库,它不依赖于指定的GLIBC版本。
告诉他们使用一些编译器选项链接我的共享库的简单方法,以使其工作。
我不知道这两种方法,我怎样才能实现这些解决方案或其中一种?
感谢。
修改
我找到了一个链接标志:-static-libgcc
如果我使用此选项构建共享库,这会有帮助吗?有什么缺点吗?
答案 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文件。
对于想要发布便携式共享库的人来说,这可能很有用。