2009-08-22 8 views
5

Kiedy zwykle używam kodu (włączając nagłówki) z bibliotek C++ innych firm (niestandardowych), wstępnie zbudowany plik binarny jest powiązany z (lub zawartym w) docelowym plikiem wykonywalnym, który reprezentuje moją aplikację, ale co się dzieje ze standardem C++ biblioteka ?, o ile widziałem, nie muszę wysyłać biblioteki z aplikacją, która używa kodu tylko z biblioteki standardowej C++, a więc jest to kod statycznie połączony i zawarty w pliku wykonywalnym?W jaki sposób biblioteka standardowa C++ jest połączona z moją aplikacją?

Odpowiedz

11

Nie, standardowe biblioteki domyślnie są dynamicznie połączone w środowisku wykonawczym.

Po uruchomieniu dynamiczny program ładujący będzie wyglądał w kilku standardowych miejscach dla bibliotek dynamicznych, jeśli wykryje, że ładuje się i działa inaczej, gdy aplikacja zostanie zamknięta.

W systemach UNIX:
/usr/lib: szukanie: libstdC++ *

na oknach:
c: \ windows \ system32 szukać: msvcrt.dll

Istnieje również kilka zmiennych środowiskowych, które mogą wpływać na ścieżkę wyszukiwania. Sprawdź swoją stronę man platform dla dlopen, aby zobaczyć, czym one są. Wszystko, czego potrzebujesz, powinno znajdować się na stronach man dla dlopena na twojej platformie.

Większość systemów posiada te biblioteki w odpowiednich miejscach i zostanie automatycznie znaleziona.
Reszta STL nie wprowadza dodatkowych współdzielonych zależności między libami.

+2

Katalog to 'c: \ windows \ system32'. Przynajmniej tam są przechowywane środowiska wykonawcze Visual Studio. Nie sądzę jednak, aby łącza MinGW do nich były. – avakar

+3

I dodać do tego, mingw łączy statycznie swoją aplikację ze swoją standardową biblioteką C++. – nos

+4

Ta odpowiedź nie jest całkowicie poprawna. libstdC++ nie jest taki sam jak MSVCRT.DLL. Ta ostatnia jest biblioteką * c *, pierwsza to biblioteka * C++ *. Prawdą jest, że każdy plik binarny generowany przez MinGW będzie zależał od MSVCRT.dll, ale to nie ma nic wspólnego z pytaniem, które zostało zadane. Jak wskazałem poniżej, a jak nos wskazuje w poprzednim komentarzu, biblioteka libstdC++ jest domyślnie połączona statycznie z plikiem wykonywalnym. –

1

Większość z nich znajduje się w plikach nagłówkowych, ponieważ jest tak silnie szablonowa. Bardzo mało wymaga libstdc++.so (iostream, może to być, jak sądzę).

+2

STL to głównie pliki nagłówkowe. Biblioteka standardowa zawiera także inne rzeczy. –

+0

Wszystkie C++ wymagają libstdC++. Ma kilka podstawowych funkcji wymaganych przez standard. –

3

Jedyna podstawowa zależność w czasie wykonywania dla programów MinGW C++ dotyczy MSVCRT.DLL. Inne zależności zależą od tego, co faktycznie robi twój program - na przykład, jeśli używa połączenia z bazą danych ODBC, będzie to zależało od ODBC32.DLL (i prawdopodobnie innych bibliotek DLL systemu Windows). Jednak używanie klas takich jak std :: string lub std :: vector w programie MinGW C++ nie wprowadza nowych zależności bibliotek dynamicznych.

Jeśli martwisz się o dynamicznych dependancies bibliotecznych, sprawdź funkcji „Dependency Walker” w http://www.dependencywalker.com/

6

w ostatnich MinGW gcc/g ++ wersje (4.40) można połączyć przeciwko dll wspólną zamiast domyślnego statycznej biblioteka przy użyciu flagi -shared-libstdC++.

Statyczne wersje biblioteki znajdują się w/mingw/lib/gcc/mingw32/[gcc version]. Nazwa pliku to libstdC++. A. To będzie domyślnie połączone podczas kompilowania aplikacji C++ z MinGW.

+3

Wygląda na to, że domyślne ustawienia MinGW zostały zmienione, przynajmniej w moim systemie jest to domyślne połączenie z libstdC++ - 6.dll. Można go wyłączyć flagą '-static-libstdC++'. – rustyx

+0

@rustyx to dobrze wiedzieć. Zapraszam do edycji mojej odpowiedzi, aby to odzwierciedlić (i udzielić odpowiedzi na głos, tak aby wypłynęła na górę;) –

+0

@rustyx Próbowałem -static-libstdC++ (i -static-libgcc), a jednak mój program wciąż dynamicznie łączy się z biblioteki mingw libstd * .dll. Mam kompilację krzyżową, każdy pomysł, dlaczego? –

1

Biblioteki uruchomieniowe języka C i C++ są połączone w taki sam sposób, jak biblioteki normalne. Główną różnicą jest to, że są one zwykle automatycznie kompilowane i łączone przez kompilator i łącznik bez potrzeby ich określania.

Niepoprawne jest jednak uogólnienie faktu, że nie trzeba ich przesyłać z aplikacją. W większości przypadków, gdy wysyłasz dynamicznie połączone pliki binarne, musisz je uwzględnić, na przykład jeśli kompilujesz z MSVC++, będziesz łączyć ze wszystkim, co jest zainstalowane na twojej maszynie, jeśli zainstalujesz dynamicznie połączony plik binarny na świeżej instalacji systemu Windows, mogą napotkać problemy, chyba że upewnisz się, że biblioteki są częścią pakietu instalacyjnego (zobacz dokumentację redistributables Visual Studio). To samo dotyczy maszyn Solaris (standardowe biblioteki są uaktualniane jako część zestawu poprawek).W przypadku Linuksa jest to bardziej skomplikowane, nie można połączyć statycznie ze względu na GPL, jednak biblioteki są zwykle instalowane za pośrednictwem pakietów dystrybucyjnych.

+0

Dobra odpowiedź, jednak mówiłem o mingw, który jest statycznie połączony ze standardowymi bibliotekami ... – Lawand

Powiązane problemy