如何告知g++
的鏈接器允許多個符號定義(選擇第一個外觀)?如何使用g ++允許-z multidefs 47
-z multidefs允許多個符號定義。默認情況下,可重定位對象(.o文件) 之間發生的多個符號定義將導致致命的錯誤情況。該選項可抑制 錯誤情況並允許執行第一個符號定義。 只有在指定了-b svr4選項時,此選項纔有效。
-zmuldefs
選項不被g++
或-z OPTION
識別。什麼是正確的參數?可能嗎?
如何告知g++
的鏈接器允許多個符號定義(選擇第一個外觀)?如何使用g ++允許-z multidefs 47
-z multidefs允許多個符號定義。默認情況下,可重定位對象(.o文件) 之間發生的多個符號定義將導致致命的錯誤情況。該選項可抑制 錯誤情況並允許執行第一個符號定義。 只有在指定了-b svr4選項時,此選項纔有效。
-zmuldefs
選項不被g++
或-z OPTION
識別。什麼是正確的參數?可能嗎?
沒有「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
不要將多個定義視爲錯誤。這不再支持。此選項已過時。
GCC使用ld
作爲linux中的鏈接器,它是由GNU創建的binutils
的一部分。
看來較新版本的ld
不支持-z muldefs
選項。您可以嘗試使用--allow-multiple-definitions
作爲替代。
你應該先在代碼中指出問題,爲什麼你有多個定義? – billz
@billz ITK和opencv都定義了碧玉的編碼和解碼功能。這不會在Linux和Windows上造成任何麻煩,只有Mac(MacPorts的gcc47)。代碼不是問題。我已經通過在沒有Jasper的情況下編譯opencv來解決它,但我仍然希望能夠通過允許多個相同的定義來解決此問題。 – quimnuss
我相信我使用的是-Xlinker選項錯了,我不得不爲每個參數使用它,我會在一個小時內回覆它。 – quimnuss