問題描述
經過數小時的穀歌搜索,我決定放棄並請教各位專家。我正在嘗試在我的 64 位 Ubuntu 11.10 中構建一個 32 位應用程序(如果有人感興趣,則為 xgap)。我在 makefile 中添加了 CFLAGS=-m32 和 LDFLAGS=-L/usr/lib32。對象被構建成 32 位精細。最後一步是將X窗口的所有對象和庫鏈接到這個可執行文件—xgap。不知何故,它一直給我這個錯誤:
gcc -o xgap xcmds.o utils.o gapgraph.o gaptext.o pty.o popdial.o xgap.o selfile.o -L/usr/lib32 -lXaw -lXmu -lXt -lXext -lX11 -lSM -lICE
/usr/bin/ld: skipping incompatible /usr/lib32/libXmu.so when searching for -lXmu
...
/usr/bin/ld: i386 architecture of input file `xcmds.o' is incompatible with i386:x86-64 output
...
我已經安裝了 ia32-libs 和 mutilib 支持。我想我隻需要強製鏈接器生成 i386 輸出。如上所示,我嘗試在我的 gcc 命令中放置兩個 ld 標誌:-melf_i386 和 -oformat elf32-i386。但是發生的事情是 gcc 不再在 /usr/lib32 中搜索 32 位庫。我想知道是否需要將這些標誌按固定順序排列?
感謝您的任何想法和幫助!
編輯:當我在最後一個 gcc 命令中添加 -m32 標誌時(我相信是鏈接階段),即使我有 -L/usr/lib32 標誌,gcc 也不再在 /usr/lib32 中搜索(真的奇怪…)並生成以下錯誤:
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.6.1/../../../libXaw.so when searching for -lXaw
/usr/bin/ld: skipping incompatible /usr/lib/libXaw.so when searching for -lXaw
/usr/bin/ld: cannot find -lXaw
collect2: ld returned 1 exit status
有人知道為什麽會這樣嗎?我正在使用自動工具進行配置和製作。我真的很擅長修改那些腳本文件。
EIDT:我解決了這個問題。我認為 gcc 期待一個靜態庫存檔。我使用 http://ubuntuforums.org/showthread.php?t=474790 中的 getlibs 腳本來下載鏈接所需的所有 .a 檔案。然後 gcc 工作。我認為 gcc 確實在 /usr/lib32 目錄中進行了搜索,但沒有找到 .a 檔案,因此繼續在標準目錄 /usr/lib 中進行搜索,在那裏它找到了不兼容的 *.so 文件。
但接下來的問題是:來自包 ia32-libs 的 /usr/lib32/中的 *.so 文件真的沒有鏈接所需的庫嗎? /usr/lib32/中的那些文件是做什麽用的?
最佳答案
LDFLAGS
也應該包括 -m32
。以下應該工作:
export LDFLAGS='-m32 -L/usr/lib32'
實際上,您可以刪除 -L/usr/lib32
部分,因為這是 32 位庫的默認目錄,並且您的係統知道這一點。
基本上,在 64 位機器上構建 32 位應用程序的最簡單方法是:
export CFLAGS='-m32'
export CXXFLAGS='-m32'
export LDFLAGS='-m32'
make
..或 feed those variables to configure script 如果您使用的是自動工具。
更新:
似乎您對鏈接靜態庫和動態庫的區別並不十分熟悉。我會盡量減少:
-
靜態和動態開發庫都具有相同的文件擴展名
.a
-
如果您安裝了同一庫的靜態和動態版本,其中一個可能有額外的後綴,例如
libname.a
用於動態版本和libname_s.a
用於靜態版本。 -
當然,靜態和動態庫版本的大小不同。靜態版較重。
-
如果您與靜態庫鏈接 – 您的應用程序沒有依賴關係。如果您與動態庫鏈接,它將依賴於係統中應該存在的
.so
運行時庫。
請注意,我們在這裏討論的不是高級技巧,例如使用 dlopen()/dlsym() API 顯式加載 DSO。
次佳答案
我收到了以下錯誤:
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.8/libstdc++.so when searching for -lstdc++
這為我修複了它:
sudo apt-get install g++-multilib
如果您使用的不是默認的 gcc 包(例如 gcc-7
),那麽您需要安裝該特定版本的包:
sudo apt-get install g++-7-multilib