gpt4 book ai didi

创建静态库

转载 作者:太空狗 更新时间:2023-10-29 15:27:13 25 4
gpt4 key购买 nike

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

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

最佳答案

简短的回答:共享库(其中 PHP 扩展是一个特例)不能依赖于静态库。

实际上,这并不完全正确。只要您的静态库构建为位置无关代码 (PIC),就可以从共享库中使用它;存档中的任何 .o 文件都需要满足 .o 文件中 undefined symbol ,您明确链接以生成 .so 将得到拉入并成为共享库文件的一部分。

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

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

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

关于创建静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10290771/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com