C 创建静态库

C 创建静态库,c,gcc,static-libraries,static-linking,php-extension,C,Gcc,Static Libraries,Static Linking,Php Extension,我正在尝试创建一个静态库,以便在PHP扩展中使用。为此,我正在使用gcc-c file.c-o file.o编译.c文件,并获取.o文件。然后我使用ar rcs lib.a*.o将所有编译的对象归档到.a文件中 完成此操作后,在编译PHP扩展名时,我引用了这个.a文件,但出现以下错误: ***警告:将共享库.la链接到 ***静态库lib.a不可移植! 如果我使用.o文件而不是.a文件,我会得到: ***警告:针对非libtool链接共享库.la ***对象file1.o file2.o不可移

我正在尝试创建一个静态库,以便在PHP扩展中使用。为此,我正在使用
gcc-c file.c-o file.o
编译
.c
文件,并获取
.o
文件。然后我使用
ar rcs lib.a*.o
将所有编译的对象归档到
.a
文件中

完成此操作后,在编译PHP扩展名时,我引用了这个
.a
文件,但出现以下错误:

***警告:将共享库.la链接到
***静态库lib.a不可移植!

如果我使用
.o
文件而不是
.a
文件,我会得到:

***警告:针对非libtool链接共享库.la
***对象file1.o file2.o不可移植!

我做错了什么?正确的方法是什么?

简短的回答:共享库(其中PHP扩展是一个特例)不能依赖于静态库

事实上,这并不完全正确。只要您的静态库构建为位置独立代码(PIC),从共享库使用它就可以了;需要归档文件中的任何
.o
文件来满足您显式链接以生成
.o
文件中未定义的符号。因此
将被拉入并成为共享库文件的一部分

将非PIC
.o
文件链接到共享库也可以用于某些ARCH(如i386),但它不可移植(并且不能用于x86_64)

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


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

将共享库链接到静态库是不可能的(除非您确实非常清楚自己在做什么)。不要这样做

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

我曾经遇到过同样的问题,但我通过修改make文件中的一些链接标志解决了这个问题


如果我使用
.o
文件,我会得到:
警告:针对非libtool对象file1.o file2.o链接共享库.la是不可移植的libtool
,PHP是。