2012-06-05 7 views
7

Ich habe nach diesem Begriff "ein Symbol exportieren" gesucht. Was bedeutet das Exportieren eines Symbols in C/C++ oder in Bezug auf die Bibliotheken (shared/static)? Woher exportieren wir die Symbole und warum? Wie lautet die Beziehung zwischen dem Export eines Symbols und dem Namen Mangling durch den Compiler?Was bedeutet das Exportieren eines Symbols?

+0

suchen Sie nach _declspec (dllimport/Export), ich bin sicher, dass Sie große Erklärungen finden können. –

+2

Außerdem wurde die Frage nicht abgelehnt, weil es ein Duplikat war, aber wahrscheinlich, weil Sie von SO der Duplikate vorgeschlagen wurden und Sie die Vorschläge ignoriert haben. –

+1

Warum ist es offtopic? – littleadv

Antwort

16

Exportieren eines Symbols bedeutet "Werbung" seine Existenz in Ihrer Objektdatei/Bibliothek und wo es ist, so dass es von anderen Modulen importiert werden konnte (= verlinkt).

Link kann statisch oder dynamisch erfolgen, aber auf jede Art und Weise muss der Linker wissen, was das Symbol ist und wo es ist, und das exportierte Symbol und das importierte Symbol müssen übereinstimmen, damit es passiert. Der Name Mangling steht damit in Beziehung (C++ Name Mangling beinhaltet die Typdefinition des Symbols im Symbolnamen, und das Mangeln des exportierten und importierten Symbols muss übereinstimmen, damit der Linker den Import-Export korrekt verknüpft).


Beispiel:

Angenommen, Sie haben eine Bibliothek "STANDARDC" (random name) und Ihr Programm SOMEPROG. Programm SOMEPROG muss auf Konsole drucken, so dass es printf aufrufen wird. Aber Sie implementieren nicht wirklich printf in Ihrem Programm SOMEPROG, Sie verwenden es einfach (= importieren), während die Implementierung woanders ist.

Die Bibliothek STANDARDC verfügt über eine Liste der exportierten Symbole, die alle Funktionen enthält, die in dieser Bibliothek implementiert sind und von außen aufgerufen werden können (= exportierte Funktionen). printf ist eine solche Funktion, so dass es in der exportierten Liste erscheint.

Der Compiler geht durch Ihre SOMEPROG.C und sieht, dass Sie printf verweisen, aber es gibt keine Implementierung für sie. Der Compiler fügt die printf der Liste der importierten Symbole für die resultierende SOMEPROG.obj, für den Linker die tatsächliche Implementierung in verknüpfen.

Der Linker nimmt Ihre SOMEPROG.obj-Datei und die STANDARDC .lib-Datei und sieht Welche Funktionen werden in der SOMEPROG.obj verwendet? Der Linker findet, dass printf nicht implementiert ist, es wird importiert, so dass der Linker alle vorhandenen .lib-Dateien durchsucht und übereinstimmende printf in der exportierten Liste von STANDARDC findet. Es dauert die Implementierung von printf von STANDARDC und verbindet es in Ihr Programm, wo immer Sie das importierte Symbol printf referenzieren.

+1

können Sie mit dem Beispiel erklären. Warum will ich mein Symbol exportieren? – Raulp

+1

@softy hat ein Beispiel hinzugefügt. – littleadv