创建静态库[英] Creating static libraries

本文是小编为大家收集整理的关于创建静态库的处理方法,想解了创建静态库的问题怎么解决?创建静态库问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我正在尝试创建一个静态库,以在我的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)构建的,使用共享库中的代码(PIC)就可以工作;需要从存档中的任何.o文件来满足您明确链接以使.o中的.o文件中的未定义符号将被拉入并成为共享库文件的一部分.

.

将非PIC .o文件链接到共享库中也将在某些 Archs上使用(如i386),但它不是便携式的(并且在x86_64上不起作用).

至于您应该做的事情,如果可能的话,我只会忘记中间.a文件,然后将所有.o文件明确链接到扩展程序的文件中.这很干净而且很简单.或者,只要您确定所有文件都像PIC一样(即使用-fPIC选项).

,您可以继续按照自己的方式进行操作.

我不做的是制作并安装一个额外的.so文件,然后将其扩展名的主文件依赖.所有这些都是创造膨胀,增加负载时间并在部署/集成中造成很多麻烦.

其他推荐答案

将共享库链接到静态库是不可能的(除非您真的非常了解您在做什么).不要做.

第一个警告来自libtool.它告诉您,您要求的操作将在不同的系统上做不同的事情,其中​​一些事情可能不是您想要的.通常,它只会以各种壮观的方式失败,因为共享和静态库的代码需要用不同的编译器标志编译.

我曾经遇到过相同的问题,但是我已经通过折叠了" make"文件中的一些链接标志来解决它,您可以看到

本文地址:https://www.itbaoku.cn/post/359399.html