2012-04-24 150 views
4

我正试图创建一个静态库在我的PHP扩展中使用。为此,我正在使用gcc -c file.c -o file.o编译我的.c文件并获取.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! 

我在做什么错的,什么是该做的正确方法是什么?

回答

5

简短回答:共享库(其中PHP扩展是一种特殊情况)不能依赖于静态库。

其实这并不完全正确。只要您的静态库构建为独立于位置的代码(PIC),从共享库中使用它就可以工作;无论需要档案中的.o文件来满足您明确链接的.o文件中未定义的符号,以使.so将被拉入并成为共享库文件的一部分。

链接非PIC .o文件到一个共享库也将在一些 archs(如I386)工作,但它不是便携式(并不会在x86_64工作)。

至于你应该做什么,如果可能的话,我会忘记中间文件.a,并将你所有的.o文件明确地链接到.so文件中。这很干净简单。或者,只要您确定所有文件都已构建为PIC(即使用-fPIC选项),您就可以继续按照自己的方式进行操作。

我不会做的是制作并安装一个额外的.so文件,主要.so文件的扩展将依靠。所有这些都会造成膨胀,增加加载时间,并在部署/集成方面造成很多麻烦。

+0

如果我使用'.o'文件,我得到:'警告:链接共享库.la与非libtool对象file1.o file2.o不可移植!' – rid 2012-04-24 02:36:04

+2

如果您使用的是libtool,则需要使用libtool构建所有内容。 – 2012-04-24 03:54:09

+0

我很想去,但我不知道如何...我不使用'libtool',PHP是。 – rid 2012-04-24 04:01:38

1

将共享库链接到静态库是不可能的(除非你真的很清楚你在做什么)。不要这样做。

第一个警告来自libtool。它告诉你,你要求的操作会在不同的系统上做不同的事情,其中​​一些事情可能不是你想要的。通常它会以各种壮观的方式失败,因为共享库和静态库中的代码需要使用不同的编译器标志进行编译。

我曾经面临同样的问题,但我已经通过corrcting make文件链接的一些标志解决它,你可以看到

What is the meaning of “Warning: Linking the shared library against static library is not portable”?