创建静态库

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)

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

R..*_*R.. 5

简短的回答:共享库(PHP扩展是一种特殊情况)不能依赖于静态库.

实际上,这并不完全正确.只要您的静态库构建为与位置无关的代码(PIC),就可以使用共享库中的静态库; .o需要存档中的任何文件来满足.o您显式链接的文件中的未定义符号,以使其.so被拉入并成为共享库文件的一部分.

将非PIC .o文件链接到共享库也可以在某些 arch(如i386)上运行,但它不可移植(并且不适用于x86_64).

至于你应该做什么,如果可能的话,我会忘记中间.a文件并将所有.o文件明确地链接到.so扩展名的文件中.这很简洁.或者你可以按照你正在做的方式继续这样做,只要你确定你的所有文件都是作为PIC构建的(即使用-fPIC选项).

我不会做的是制作并安装一个额外的.so文件,.so扩展的主文件将依赖于该文件.所有这一切都会造成膨胀,增加加载时间,并且在部署/集成方面会遇到很多麻烦.

  • 如果您正在使用libtool,则需要使用libtool构建所有内容. (2认同)