rid*_*rid 4 c gcc static-libraries php-extension static-linking
我正在尝试创建一个静态库,以便在我的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!
Run Code Online (Sandbox Code Playgroud)
如果我使用.o文件而不是.a文件,我得到:
*** Warning: Linking the shared library <extension>.la against the non-libtool
*** objects file1.o file2.o is not portable!
Run Code Online (Sandbox Code Playgroud)
我做错了什么,这样做的正确方法是什么?
简短的回答:共享库(PHP扩展是一种特殊情况)不能依赖于静态库.
实际上,这并不完全正确.只要您的静态库构建为与位置无关的代码(PIC),就可以使用共享库中的静态库; .o需要存档中的任何文件来满足.o您显式链接的文件中的未定义符号,以使其.so被拉入并成为共享库文件的一部分.
将非PIC .o文件链接到共享库也可以在某些 arch(如i386)上运行,但它不可移植(并且不适用于x86_64).
至于你应该做什么,如果可能的话,我会忘记中间.a文件并将所有.o文件明确地链接到.so扩展名的文件中.这很简洁.或者你可以按照你正在做的方式继续这样做,只要你确定你的所有文件都是作为PIC构建的(即使用-fPIC选项).
我不会做的是制作并安装一个额外的.so文件,.so扩展的主文件将依赖于该文件.所有这一切都会造成膨胀,增加加载时间,并且在部署/集成方面会遇到很多麻烦.
| 归档时间: |
|
| 查看次数: |
2353 次 |
| 最近记录: |