2012-04-09 167 views
0

我的系统是Centos 5.8 64位,我想编译一个链接到32位库的文件。编译时加上-m32,但结果显示“输入文件”gc_basic_call_model_voice_video_3g_cnf_nbup.o“的i386:x86-64架构与i386输出不兼容”。 看来,该文件不能在32位编译。但是如果我不添加-m32,库不能被编译。如何成功编译文件,谢谢!如何编译与32位库链接的64位文件

+0

哪台机器? Linux呢? – weima 2012-04-09 05:16:27

+0

你使用过标志'-fPIC'和'-rdynamic' – weima 2012-04-09 05:19:41

+0

我使用命令“gcc -m32 A.c B.c -Ldir -o output1.o output2.o”。但结果显示i386:输入文件“output1.o”的x86-64架构与i386输出不兼容。 dir中的文件是32位库。我不知道该怎么做:( – Jasoniem9246 2012-04-09 05:43:38

回答

6

您不能在同一个程序中混合使用32位和64位代码。编译器告诉你,你的.o文件之一被编译为64位对象,所以它不能链接到32位可执行文件中。您需要重新编译该目标文件,也可能使用其他源代码,使用-m32来处理所有内容。

+1

或者你可能会引入64位库(而不是64位对象)。无论如何:*不能*混合匹配32位和64位代码。你必须重新编译你所有的.c源文件,并设置你的-L库路径标志,以确保你只读取* 32位文件。 – paulsm4 2012-04-09 05:39:23

+0

@ paulsm4,这是一种可能性,但在这种情况下,错误消息明确说它是一个目标文件。 – Wyzard 2012-04-10 23:44:30

0

假设你编译你的程序的32位版本(姑且称之为foo.c的)以下列方式:

gcc -m32 -c foo.c -o foo.o 

您应该然后调用使用-melf_i386标志就可以了链接。

ld <whatever commands/flags you gave earlier> -melf_i386 

实施例:

ld -o foo.bin --oformat binary basic.o -melf_i386