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?
Odpowiedz
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
.
poszukaj _declspec (dllimport/export), jestem pewien, że możesz znaleźć świetne wyjaśnienia. –
Ponadto, pytanie nie zostało odrzucone, ponieważ było duplikatem, ale prawdopodobnie dlatego, że zasugerowałeś SO z duplikatów i zignorowałeś sugestie. –
Dlaczego to jest offtopic? – littleadv