c/c++语言开发共享创建静态库

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

      (0)
      上一篇 2021年12月13日
      下一篇 2021年12月13日

      精彩推荐