2012-06-05 22 views
7

Poszukuję tego terminu "eksportowanie symbolu". Co oznacza eksportowanie symbolu w języku C/C++ lub w odniesieniu do bibliotek (współużytkowanych/statycznych)? Skąd eksportujemy symbole i dlaczego? Jaka jest relacja eksportu symbolu do nazwy "mangring" przez kompilator?Co oznacza eksportowanie symbolu?

+0

poszukaj _declspec (dllimport/export), jestem pewien, że możesz znaleźć świetne wyjaśnienia. –

+2

Ponadto, pytanie nie zostało odrzucone, ponieważ było duplikatem, ale prawdopodobnie dlatego, że zasugerowałeś SO z duplikatów i zignorowałeś sugestie. –

+1

Dlaczego to jest offtopic? – littleadv

Odpowiedz

16

Wyeksportowanie symbolu oznacza "reklamowanie" jego istnienia w pliku/bibliotece obiektu i gdzie jest, aby można było go zaimportować (= połączyć z) przez inne moduły.

Łącze może być wykonane statycznie lub dynamicznie, ale tak czy inaczej linker musi wiedzieć, czym jest symbol, i gdzie on jest, a wyeksportowany symbol i zaimportowany symbol muszą pasować do niego. Z tym wiąże się mangling nazw (wymazanie nazw C++ zawiera definicję typu symbolu w nazwie symbolu, a zniekształcanie wyeksportowanego i importowanego symbolu musi pasować do linkera, aby poprawnie powiązać import-eksport).


Przykład:

Załóżmy, że masz biblioteki "STANDARDC" (losowa nazwa) i Twój program SOMEPROG. Program SOMEPROG musi drukować na konsoli, więc zadzwoni pod numer printf. Ale faktycznie nie implementujesz printf w swoim programie SOMEPROG, po prostu go używasz (= importuj), a implementacja jest gdzie indziej.

Biblioteka STANDARDC ma listę eksportowanych symboli, które obejmują wszystkie funkcje zaimplementowane w tej bibliotece i mogą być wywoływane z zewnątrz (= wyeksportowane funkcje). printf jest jedną z takich funkcji, więc pojawi się na wyeksportowanej liście.

Kompilator przechodzi przez SOMEPROG.C i widzi, że odwołujesz się do printf, ale nie ma na to żadnej implementacji. Kompilator dodaje printf do listy zaimportowanych symboli dla wynikowego pliku SOMEPROG.obj, aby linker mógł połączyć rzeczywistą implementację.

Łącznik pobiera plik SOMEPROG.obj i plik STB STANDARD. jakie funkcje są używane w SOMEPROG.obj. Łącznik stwierdza, że ​​printf nie jest zaimplementowany, jest zaimportowany, więc linker przegląda wszystkie pliki .lib, które posiada i znajduje pasujące printf na wyeksportowanej liście STANDARDC. Wymaga wdrożenia printf ze STANDARDC i łączy go z programem wszędzie tam, gdzie odwołujesz się do zaimportowanego symbolu printf.

+1

możesz wyjaśnić na przykładzie. Dlaczego chcę eksportować mój symbol? – Raulp

+1

@softy dodał przykład. – littleadv