创建静态库

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!

我做错了什么,正确的做法是什么?
2个回答

5
简单来说,共享库(其中PHP扩展是一个特殊情况)不能依赖于静态库。
实际上这并不完全正确。只要您的静态库被构建为位置无关代码(PIC),从共享库中使用它就可以了。需要满足未定义符号的.o文件将被拉入并成为共享库文件的一部分。
将非PIC .o文件链接到共享库在某些架构(如i386)上也可以工作,但它不是可移植的(并且在x86_64上无法工作)。
至于你应该做什么,如果可能的话,我会忘记中间的.a文件,并将所有的.o文件显式地链接到扩展名为.so的文件中。这样干净简单。或者,只要确保所有的文件都以-fPIC选项构建,就可以继续按照你目前的方式进行。
我不会制作和安装一个额外的.so文件,然后主.so文件的扩展将依赖于它。这只会产生膨胀,增加加载时间,并在部署/集成方面造成许多麻烦。

如果我使用.o文件,会得到以下警告:警告:将共享库<extension>.la与非libtool对象文件file1.o file2.o链接不具可移植性! - rid
2
如果您正在使用libtool,那么您需要使用libtool构建所有内容。 - R.. GitHub STOP HELPING ICE
我很想帮忙,但我不知道怎么做…… 我没有使用 libtool,我在使用 PHP。 - rid

1

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

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

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

“Warning: Linking the shared library against static library is not portable”是什么意思?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接