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

我正在使用Ubuntu,并且按照本网站上的说明制作了一个静态c库。

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

我知道一个.a档案包含对象文件(在我的情况下只有一个),所以,我可以用不同的机器(i386和amd64)编译的目标文件打包到一起,以便GCC知道哪个文件应该使用?

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

例:

档案名称“libvisualt64.a”

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

说:

在search-lvisualt64时跳过不兼容的./libvisualt.a
找不到-lvisualt64
错误:ld返回1退出状态

在这种情况下,我编译了源代码,并在昨天将这个存档build立在同一台64位机器上。 而且昨天它工作正常。 这也发生在32位机器上。

Linux使用称为ELF的可执行文件格式。 ELF文件只能包含单个体系结构的必要机器代码。

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

如果你真的想要一个单独的二进制文件来支持多种体系结构,那么你可能对FatELF感兴趣……虽然没有内核补丁就不支持它:

到目前为止,FatELF没有被集成到内核主线中。


为了解决你的编辑问题,很可能你的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