4

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

这样做之后,我.a在编译我的 PHP 扩展时引用了这个文件,但是我得到了以下错误:

*** 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!

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

4

2 回答 2

5

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

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

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

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

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

于 2012-04-24T02:30:52.857 回答
1

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

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

我曾经遇到过同样的问题,但我已经通过在make文件中纠正一些链接标志来解决它,你可以看到

“警告:将共享库与静态库链接起来不可移植”是什么意思?

于 2012-04-24T04:47:36.187 回答