2012-06-05 213 views
7

我一直在尋找這個術語「導出符號」。在C/C++或庫(共享/靜態)中導出符號意味着什麼?我們從哪裏出口這些符號?爲什麼?導出符號與編譯器名稱混合的關係是什麼?輸出符號是什麼意思?

+0

尋找_declspec(dllimport/export),我相信你可以找到很好的解釋。 –

+2

此外,這個問題沒有被降低,因爲它是一個重複的,但可能是因爲你被重複建議,你忽略了這些建議。 –

+1

它爲什麼不重要? – littleadv

回答

16

導出符號意味着「廣告」它在對象文件/庫中的存在以及它的位置,以便它可以被其他模塊導入(=鏈接到)。

鏈接可以靜態或動態完成,但無論哪種方式,鏈接器都必須知道符號是什麼以及它在哪裏,導出的符號和導入的符號必須匹配才能發生。名稱變形與此相關(C++名稱變形在符號名稱中包含符號的類型定義,並且導出和導入符號的變形必須與鏈接器正確鏈接導入導出相匹配)。


例子:

假設你有一個圖書館 「STANDARDC」(隨機名稱)和程序SOMEPROG。程序SOMEPROG需要打印到控制檯,因此它將調用printf。但是你實際上並沒有在你的程序SOMEPROG中實現printf,你只是使用它(=導入它),而實現在別處。

STANDARDC庫有一個它導出的符號列表,其中包括在該庫中實現的所有功能,可以從外部調用(=導出的函數)。 printf是這樣的函數之一,所以它會出現在導出的列表中。

編譯器檢查您的SOMEPROG.C,發現您引用了printf,但沒有實現它。編譯器將printf添加到生成的SOMEPROG.obj的導入符號列表中,供鏈接器鏈接實際的實現。

鏈接器將您的SOMEPROG.obj文件和STANDARDC .lib文件SOMEPROG.obj中使用了哪些函數。鏈接器發現printf未實現,它被導入,因此鏈接器將查看它所有的.lib文件,並在導出的STANDARDC列表中找到匹配的printf。它需要執行STANDARDC中的printf,並將它鏈接到您的程序中的任何地方,因爲您引用導入的符號printf

+1

你能解釋一下這個例子嗎?爲什麼我要導出我的符號? – Raulp

+1

@softy增加了一個例子。 – littleadv