2010-10-29 272 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