2013-07-03 16 views
0

如何告知g++的鏈接器允許多個符號定義(選擇第一個外觀)?如何使用g ++允許-z multidefs 47

-z multidefs允許多個符號定義。默認情況下,可重定位對象(.o文件) 之間發生的多個符號定義將導致致命的錯誤情況。該選項可抑制 錯誤情況並允許執行第一個符號定義。 只有在指定了-b svr4選項時,此選項纔有效。

-zmuldefs選項不被g++-z OPTION識別。什麼是正確的參數?可能嗎?

+0

你應該先在代碼中指出問題,爲什麼你有多個定義? – billz

+0

@billz ITK和opencv都定義了碧玉的編碼和解碼功能。這不會在Linux和Windows上造成任何麻煩,只有Mac(MacPorts的gcc47)。代碼不是問題。我已經通過在沒有Jasper的情況下編譯opencv來解決它,但我仍然希望能夠通過允許多個相同的定義來解決此問題。 – quimnuss

+0

我相信我使用的是-Xlinker選項錯了,我不得不爲每個參數使用它,我會在一個小時內回覆它。 – quimnuss

回答

2

沒有「g ++的鏈接器」這樣的事情,它使用你的系統自己的鏈接器。

爲了通過GCC傳遞選項,你需要使用GCC的-Wl,-Xlinker選項鍊接:

-Xlinker option
option作爲一個選項給連接器。您可以使用它來提供GCC不知道如何識別的系統特定鏈接器選項。
如果您想傳遞帶有單獨參數的選項,則必須使用-Xlinker兩次,一次用於選項,一次用於參數。例如, 要通過-assert definitions,您必須編寫-Xlinker -assert -Xlinker definitions。它不能編寫-Xlinker "-assert definitions",因爲 這會將整個字符串作爲單個參數傳遞,這不是鏈接器所期望的。
使用GNU鏈接器時,通常使用option=value語法將參數傳遞給鏈接器選項比作爲單獨的參數更方便。例如,您可以指定-Xlinker -Map=output.map而不是-Xlinker -Map -Xlinker output.map。對於 命令行選項,其他鏈接程序可能不支持此語法。

-Wl,option
通過option作爲鏈接器的選項。如果option包含逗號,則它在逗號處被分割爲多個選項。您可以使用此語法將 參數傳遞給該選項。例如,-Wl,-Map,output.map-Map output.map傳遞給鏈接器。當使用GNU鏈接器時,您也可以使用與-Wl,-Map=output.map相同的效果。

所以,你會想用

-Xlinker -z -Xlinker multidefs 

-Wl,-z,multidefs 

,但你引用文檔說,你還必須使用-b svr4使用該選項,例如

-Wl,-b,svr4,-z,multidefs 

編輯:從你的意見,我看到你在Mac OS X,它使用達爾文連接器,其man page顯示相應的選項已過時:

-m不要將多個定義視爲錯誤。這不再支持。此選項已過時。

+0

謝謝@Jonathan它看起來像XCode系統的'ld'不是GNU鏈接器,因爲它不能識別這些選項。實際上'-b'已被棄用。那麼,我該如何告訴鏈接器忽略多個定義? – quimnuss

+0

哦,有人知道Mac的XCode使用什麼鏈接器? – quimnuss

+0

它使用達爾文鏈接器,請參閱http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man1/ld.1.html,其中說「-m不要處理多個定義作爲錯誤,不再支持,這個選項是 已過時。「 –

0

GCC使用ld作爲linux中的鏈接器,它是由GNU創建的binutils的一部分。

看來較新版本的ld不支持-z muldefs選項。您可以嘗試使用--allow-multiple-definitions作爲替代。

+0

正如Jonathan Wakely所說,沒有「GCC鏈接器」,它使用'GNU binutils'的'ld'作爲鏈接器。最新的'GNU binutil'是版本2.28,它似乎不支持'-z muldef'選項。您可以使用'--allow-multiple-definitions'作爲替代。 – CatDog

+0

它實際上是--allow-multiple-definition,沒有's' – philipp