创建静态库

时间:2012-04-24 01:52:30

标签: c gcc static-libraries static-linking php-extension

我正在尝试创建一个静态库,以便在我的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!

我做错了什么以及这样做的正确方法是什么?

2 个答案:

答案 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”?