2012-02-08 52 views
3

我不希望gcc鏈接器將未定義的符號顯示爲鏈接錯誤。我在MAC OSX上使用gcc 4.2.0 10.6gcc:允許未定義的符號

當然,我已經在線尋找解決方案,但所有嘗試都失敗了!

如何修改此命令以擺脫未定義的符號錯誤?

gcc -o Proj $(wildcard *.o); 

謝謝。

編輯:我工作的一個研究項目,我需要的代碼可鏈接&我不在乎它是否將有運行時異常

+3

該命令與該問題有什麼關係?另外,如果鏈接階段失敗,你如何期望得到一個可執行的二進制文件? ......有一個原因,它是一個錯誤,而不是一個警告;) – 0xC0000022L 2012-02-08 19:24:19

+3

這是我有史以來最喜歡的問題之一。 – 2012-02-08 19:28:05

+0

有選項來抑制鏈接錯誤,就像在這裏sourceware.org/binutils/docs/ld/Options.html我正在研究一個研究項目,我需要的代碼是可以鏈接的,我不在乎它是否可以鏈接,會有運行時異常 – Pansy 2012-02-08 19:30:48

回答

5

咦?這是沒有意義的。它一個錯誤,它不能被忽略。鏈接器無法完成工作時,您無法構建可執行文件。你會期望它只是發明一個實現,並希望它只是工作?

相反,您需要了解如何正確配置要構建的項目。如果您依賴於外部庫,則需要在鏈接器搜索路徑中添加路徑。

編輯:每評論...

有選擇壓制也喜歡在這裏sourceware.org/binutils/docs/ld/Options.html我工作的一個研究項目的鏈接錯誤我需要的代碼是可鏈接的&我不在乎它是否有運行時異常

那麼,你仍然不能,它仍然沒有任何意義。更仔細地閱讀該節:

的原因,允許在鏈接時指定共享庫未定義的符號引用是:

在鏈接時指定的共享庫可能不一樣的一個這在加載時可用,所以符號可能實際上在加載時可解析。 有一些操作系統,例如BeOS和HPPA,共享庫中的未定義符號是正常的。

所以,有一些情況,其中允許未定義的符號共享庫是合理的,因爲你可以不連接到相同的版本,你將在實踐中鏈接到一個動態庫。

但是,您想構建一個可執行文件,而不是共享庫,因此它沒有任何意義來執行您所要求的操作。您只需擁有一個可執行文件,並且無法運行。爲什麼會有一個健全的編譯器允許這樣的條件?

+0

有選項來壓制像這裏http://sourceware.org/binutils/docs/ld/Options.html鏈接錯誤 我正在工作一個研究項目,我需要的代碼可以鏈接,我不在乎它是否會有運行時異常 – Pansy 2012-02-08 19:29:20

+0

@Pansy:我編輯了我的回覆,但它不是你以後的樣子。 – 2012-02-08 20:04:24

+0

鏈接文檔適用於GNU ld,不適用於OS X,但GNU ld實際上允許您使用--unresolved-symbols = ignore-all生成帶有未解析符號的可執行文件。這樣做「有道理」,因爲它有明確的定義,但這不是明智的做法。爲什麼一個理智的編譯器會允許這樣做?通過判斷不是編譯器的工作。 – Praxeolitic 2014-09-22 00:22:04

1

您可以改爲使用ld -r -o Proj.o $(wildcard *.o)
你將得到的將不會是一個你可以運行的可執行文件,而是一個可以鏈接到可執行文件的目標文件。在最後的聯繫中,您必須提供未解決的符號。

0

您可能想要創建一個不是exe的庫。這些不應該生成鏈接器錯誤。

ar r libProj.a $(wildcard *.o) 
ranlib libProj.a