2010-10-29 20 views
10

在64位主机上我试图用-m32选项来构建共享库。这些库可以与常规的64位库链接吗?GCC -m32标志:/ usr/bin/ld:跳过不兼容

我做这样的事情:

g++ -m32 -shared source.cpp -l 64_bit_library.so -o 32_bit_library.so 

,并收到错误消息是这样的:

/usr/bin/ld: skipping incompatible 64_bit_library.so 

所以我的问题是:如何64_bit_library.so32_bit_library.so应64位主机上进行编译,以使32_bit_library.so64_bit_library.so链接成为可能?

回答

11

无法将32位应用程序与64位库链接,反之亦然。问题是通常指针和类型不能在它们之间传递。正常情况下,解决方法是生成其他大小的子进程,并使用IPC与该进程进行通信。

想想这样说:如果我有一个C平凡函数:

extern void foo(void*); 

如果是在64位的库,我尝试从一个32位的库调用它哪里指针的另一半来从?

相反,如果它位于一个32位库中,而我从64位应用程序调用它,那么指针的另一半会发生什么情况,我将不得不失去调用它?

+0

如果你真的很小心,你可以使用typedef,带有MAP_32BIT标志的mmap和共享内存段来玩一些游戏,但这是一个非常麻烦的事! – Flexo 2010-10-29 14:08:29

+0

你能告诉我如何检查它是不兼容的吗?使用readelf也许? - http://rzr.online.fr/q/gcc – RzR 2011-10-07 12:15:01

+0

@rzr - 最简单的检查方法就是在共享对象上使用'file'命令并查看它是否与您正在尝试的内容匹配与gcc做。例如,你可以用'readelf -h'或'objdump -x'来解决它,但是我发现'file'的输出更加简洁。 – Flexo 2011-10-07 12:20:48