我正在尝试创建一个静态库,以便在我的PHP扩展中使用。为此,我正在使用.c
编译gcc -c file.c -o file.o
个文件并获取.o
个文件。然后我使用ar rcs lib.a *.o
将所有编译的对象存档到.a
文件中。
执行此操作后,我在编译PHP扩展时引用此.a
文件,但是出现以下错误:
*** Warning: Linking the shared library <extension>.la against the
*** static library lib.a is not portable!
如果我使用.o
文件而不是.a
文件,我会得到:
*** Warning: Linking the shared library <extension>.la against the non-libtool
*** objects file1.o file2.o is not portable!
我做错了什么以及这样做的正确方法是什么?
答案 0 :(得分:5)
简短回答:共享库(PHP扩展是特殊情况)不能依赖于静态库。
实际上这并不完全正确。只要您的静态库构建为与位置无关的代码(PIC),就可以使用共享库中的静态库;为了满足您明确链接的.o
文件中的未定义符号,需要存档中的任何.o
个文件,以使.so
被拉入并成为共享库文件的一部分。< / p>
将非PIC .o
文件链接到共享库也可以在某些 archs(如i386)上运行,但它不可移植(并且不能在x86_64上运行)。
至于你应该做什么,如果可能,我会忘记中间.a
文件,并将所有.o
文件明确地链接到扩展名的.so
文件中。这很简洁。或者,只要您确定所有文件都构建为PIC(即使用-fPIC
选项),您就可以按照自己的方式继续这样做。
我不会做的是制作并安装额外的.so
文件,然后该扩展程序的主.so
文件依赖于该文件。所有这一切都会造成膨胀,增加加载时间,并且在部署/集成方面会遇到很多麻烦。
答案 1 :(得分:1)
将共享库链接到静态库是不可能的(除非您真的非常清楚自己在做什么)。不要这样做。
第一个警告来自libtool。它告诉你,你要求的操作将在不同的系统上做不同的事情,其中一些可能不是你想要的。通常它会以各种壮观的方式失败,因为共享和静态库中的代码需要使用不同的编译器标志进行编译。
我曾遇到过同样的问题,但我已经通过修改make文件中的一些链接标志来解决它,你可以看到
What is the meaning of “Warning: Linking the shared library against static library is not portable”?