我正在尝试创建一个静态库,以便在我的PHP扩展中使用。 为此,我使用gcc -c file.c -o file.o
编译我的.c
文件并获取.o
文件。 然后我使用ar rcs lib.a *.o
将所有编译的对象存档到.a
文件中。
执行此操作后,我在编译我的PHP扩展时引用此.a
文件,但是我收到以下错误:
*** Warning: Linking the shared library .la against the *** static library lib.a is not portable!
如果我使用.o
文件而不是.a
文件,我得到:
*** Warning: Linking the shared library .la against the non-libtool *** objects file1.o file2.o is not portable!
我做错了什么,这样做的正确方法是什么?
简短的回答:共享库(PHP扩展是特殊情况)不能依赖于静态库。
实际上,这并不完全正确。 只要您的静态库构建为与位置无关的代码(PIC),就可以使用共享库中的静态库; 需要存档中的任何.o
文件来满足您明确链接的.o
文件中的未定义符号,以使.so
将被拉入并成为共享库文件的一部分。
将非PIC .o
文件链接到共享库也可以在某些 arch(如i386)上运行,但它不可移植(并且不适用于x86_64)。
至于你应该做什么,如果可能的话,我会忘记中间的.a
文件,并将所有.o
文件显式链接到扩展名的.so
文件中。 这很简洁。 或者,只要您确定所有文件都构建为PIC(即使用-fPIC
选项),您就可以按照自己的方式继续操作。
我不会做的是制作并安装一个额外的.so
文件,扩展名的主要.so
文件将依赖于该文件。 所有这一切都会造成膨胀,增加加载时间,并且在部署/集成方面会遇到很多麻烦。
将共享库链接到静态库是不可能的(除非你真的非常清楚你在做什么)。 不要这样做。
第一个警告来自libtool。 它告诉你,你要求的操作将在不同的系统上做不同的事情,其中一些可能不是你想要的。 通常它会以各种壮观的方式失败,因为共享和静态库中的代码需要使用不同的编译器标志进行编译。
我曾经遇到过同样的问题但是我已经通过在make文件中修改一些链接标志来解决它你可以看到
“警告:将共享库与静态库链接不可移植”是什么意思?
需要了解更多c/c++开发分享创建静态库,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!
以上就是c/c++开发分享创建静态库相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/979839.html