加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在C中创建一个多架构静态库

发布时间:2020-12-16 07:20:49 所属栏目:百科 来源:网络整理
导读:我正在研究Ubuntu,我按照 this site上的说明创建了一个静态c库. 但是生成的.a包只能在编译它的机器上运行. 我知道.a存档包含目标文件(在我的情况下只有一个),因此,我可以将在不同机器(i386和amd64)中编译的目标文件打包在一起,以便GCC能够知道应该使用哪个文
我正在研究Ubuntu,我按照 this site上的说明创建了一个静态c库.

但是生成的.a包只能在编译它的机器上运行.

我知道.a存档包含目标文件(在我的情况下只有一个),因此,我可以将在不同机器(i386和amd64)中编译的目标文件打包在一起,以便GCC能够知道应该使用哪个文件吗?

如果我不能,至少可以让我的图书馆被其他相同的机器识别?
(使用-L.-llibraryname)

例:

存档名称“libvisualt64.a”

命令:gcc -o main main.c -L. -lvisualt64

说:

skipping incompatible ./libvisualt.a when searching for -lvisualt64
cannot find -lvisualt64
error: ld returned 1 exit status

在这种情况下,我编译了源代码,并在昨天在同一台64位机器上构建了存档.
昨天它工作正常.
这也发生在32位机器上.

解决方法

Linux使用名为 ELF的可执行文件格式.
ELF文件只能包含单个体系结构所需的机器代码.

在同一架构的另一台机器上使用您的库应该没有问题.唯一可能的问题可能与依赖关系有关.

如果你真的想要一个二进制文件来支持多种架构,那么你可能会对FatELF感兴趣…虽然它不支持without a kernel patch:

Up to now the FatELF is not integrated in the kernel mainline.

为了解决您的编辑问题,您的libvisualt64.a可能不是针对gcc所针对的相同架构而构建的……

您需要从存档中提取目标文件,并将它们与gcc的目标进行比较:

ar xv ${STATIC_LIBRARY}
file *.o
gcc -v 2>&1 | grep '^Target: '

我看到以下(兼容)输出:

test.o: ELF 64-bit LSB  relocatable,x86-64,version 1 (SYSV),not stripped
Target: x86_64-linux-gnu

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读