當前位置: 首頁>>技術教程>>正文


在 64 位 Ubuntu 中構建 32 位應用程序

,

問題描述

經過數小時的穀歌搜索,我決定放棄並請教各位專家。我正在嘗試在我的 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

參考資料

本文由Ubuntu問答整理, 博文地址: https://ubuntuqa.com/zh-tw/article/13147.html,未經允許,請勿轉載。