2010-06-25 174 views
25

當我嘗試在本地機器上編譯我的項目的副本時,出現錯誤,指出它跳過了不兼容的庫。當我在工作中託管在服務器上的實時版本時,情況並非如此[它完美地實現了這一點]。在編譯時跳過不兼容的庫

各種其他網站讓我相信這可能是一個環境問題,因爲我正在開發一個64位的Ubuntu發行版,我假設服務器版本在32位上運行。然而,我的環境變量設置爲後:

CFLAGS+=" -m32" 
CXXFLAGS+=" -m32" 

我仍然收到同樣編譯錯誤:

/usr/bin/ld: skipping incompatible /dvlpmnt/libPI-Http.a when searching for -lPI-Http 

能HAZ教程?

== 編輯 ==

這是我收到的輸出,當我跟喬納森的建議是:

http.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped 

顯然,問題庫是32位的畢竟?

+1

那個庫肯定是32位的嗎?試試'file/dvlpmnt/libPI-Http.a' – Rup 2010-06-25 16:31:09

+0

@Rup:這很可能會說'當前ar檔案',這不是非常有用的。您必須在檔案中找到一個文件,如我的答案所示。 – 2010-06-25 16:54:52

+0

請發佈鏈接器命令行...你是對的,看起來庫是32位的,但也許鏈接器正在尋找64位庫,儘管你認爲你做了什麼。 – 2010-06-25 17:32:08

回答

28

該消息實際上並不是一個錯誤 - 這只是一個警告,表明所討論的文件不是正確的架構(例如,32位與64位,錯誤的CPU架構)。鏈接器將繼續尋找正確類型的庫。

當然,如果你也相處的can't find lPI-Http行的錯誤,那麼你有問題:-)

很難提出準確的補救措施是什麼不知道你的編譯系統的細節和生成文件,但這裏有幾個鏡頭在黑暗中:

  1. 只是爲了檢查:通常你會增加 標誌來CFLAGS而非 CTAGS - 你確定這是正確的 ? (你有什麼可能是正確的 - 這將取決於你的構建系統!)
  2. 通常情況下,需要將該標誌傳遞給鏈接 - 所以您可能還需要修改LDFLAGS

如果不能幫助 - 您可以發佈完整的錯誤輸出,加上實際的命令(例如gcc foo.c -m32 -Dxxx等)正在執行?

+1

對不起,你是對的。我使用了CFLAGS而不是CTAGS:P – 2010-06-25 16:41:24

+0

除了這個解決方案之外,您還可以在''CFLAGS'中添加'-Wl, - no-warn-search-mismatch',這些警告就會被抑制。 – 2016-12-02 13:51:02

9

通常情況下,這本身並不是一個錯誤;這是一個警告,它找到的第一個文件與編譯器/鏈接器的-lPI-Http參數匹配無效。當沒有其他庫可以找到正確的內容時發生該錯誤。

因此,您需要查看/dvlpmnt/libPI-Http.a是32位目標文件還是64位目標文件的庫 - 如果使用-m32選項進行編譯,它可能會是64位。然後,您需要確定是否有其他位置是32位的替代文件libPI-Http.alibPI-Http.so。如果是這樣,請確保包含它的目錄在連接器的參數-L/some/where中列出。如果沒有,那麼你需要從某處獲取或構建一個32位版本的庫。

,以確定哪些是在該庫中,你可能需要做:

mkdir junk 
cd junk 
ar x /dvlpmnt/libPI-Http.a 
file *.o 
cd .. 
rm -fr junk 

的「file」的步驟告訴你什麼類型的對象文件是在存檔。其餘的只是確保你不會弄髒不易清理的東西。

+1

呵呵,這很奇怪,這一步現在向我展示了所有問題的庫實際上都是32位的。 o__o – 2010-06-25 16:45:00

+1

@defaultstring:什麼是實際的鏈接命令行?它是否包含'-m32'標誌?在問題中加入這個額外的信息,而不是作爲額外的評論在這裏,請。 – 2010-06-25 16:52:26