2015-03-13 11 views
9

Jedną z wielu kluczowych różnic między kompilatorami C++ GCC & MSVC jest to, że w pierwszym wszystkie symbole z biblioteki współdzielonej są eksportowane domyślnie, podczas gdy MSVC nie eksportuje niczego.Jakie jest uzasadnienie projektu między GCC eksportujące wszystkie symbole domyślnie vs MSVC domyślnie nie eksportujących?

Niektóre implikacje są takie, że w programie MSVC należy wyeksportować wykluczające instancje klas szablonów.

Chociaż zaakceptowałem to jako fakt, zastanawiałem się, jakie są konsekwencje projektu, kompromisy, z perspektywy konstruktora kompilatora itp. Każdego podejścia?

+5

Zachowanie GCC zostało prawie na pewno wybrane ze względu na zgodność z istniejącymi kompilatorami UNIX. Specyfikacja [ELF] (http://en.wikipedia.org/wiki/Executable_and_Linkable_Format) mówi, że symbole mają globalną widoczność domyślnie. Jest to tradycyjne zachowanie języka C: symbole są globalne, chyba że zostały zadeklarowane jako "statyczne". –

Odpowiedz

2

Prawdopodobnie ma to coś wspólnego z tym, jakie pliki wykonywalne i biblioteki znajdują się w ich odpowiednich systemach operacyjnych.

W systemie Windows obie biblioteki (DLL) i pliki wykonywalne to to samo. Dosłownie, możesz zmienić nazwę pliku .dll na .exe, a uruchomi on tryb chroniony i wygeneruje błąd (ponownie, tryb chroniony, więc będzie działać tylko w systemie 16-bitowym). Biorąc pod uwagę, że są one takie same i możesz (i robisz!) Wyeksportować symbole z rzeczywistych plików wykonywalnych, można się spodziewać, że domyślnie nie wyeksportujesz niczego poprawnie?

W przypadku Linuksa pliki wykonywalne są ich własnymi rzeczami, a biblioteki kodu (obiekty współużytkowane, .so) są czymś innym. W rzeczywistości pliki .so są bliższe archiwom (.a, rodzaj bibliotek gcc - , ale tak naprawdę nie są archiwami), jeśli dobrze pamiętam. Nie ma potrzeby dołączania pliku .lib do korzystania z biblioteki współużytkowanej, tak jak w systemie Windows, ponieważ jest to plik biblioteczny sortowania. Biorąc pod uwagę, że wyraźnie kompilujesz swoje dane wyjściowe w tej bibliotece współdzielonej, nie widzę w tym nic dziwnego, domyślnie eksportując wszystko.

+2

. A naprawdę nie jest tak jak .a –

+0

Czy to biblioteka? To jedna z tych rzeczy, prawda? Minęło trochę czasu odkąd użyłem łańcucha narzędziowego Linuksa. – Blindy

+0

"Biblioteka" może odnosić się do '.so' (biblioteki dynamicznej lub biblioteki współdzielonej) lub' .a' (biblioteki statycznej lub archiwum), ale są to bardzo różne rzeczy. –

Powiązane problemy