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
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.
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ę).
STL to głównie pliki nagłówkowe. Biblioteka standardowa zawiera także inne rzeczy. –
Wszystkie C++ wymagają libstdC++. Ma kilka podstawowych funkcji wymaganych przez standard. –
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/
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.
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
@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ę;) –
@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? –
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.
Dobra odpowiedź, jednak mówiłem o mingw, który jest statycznie połączony ze standardowymi bibliotekami ... – Lawand
- 1. C++ Statycznie połączona biblioteka współdzielona
- 2. Czy biblioteka standardowa C++ jest wymienna?
- 3. Standardowa biblioteka C w mingW
- 4. Czy standardowa biblioteka Pythona jest naprawdę standardowa?
- 5. Czym jest standardowa biblioteka Haskell?
- 6. Czy biblioteka standardowa C++ jest w pełni obsługiwana w Arduino?
- 7. Gdzie jest standardowa biblioteka C w systemie Mac OS X?
- 8. W jaki sposób Vista generuje ikonę dokumentów powiązanych z moją aplikacją?
- 9. standardowa biblioteka `typ file`
- 10. Czy standardowa biblioteka C++ 11 ma nagłówki z nagłówkami forward?
- 11. Czy powinienem łączyć biblioteki C z moją aplikacją Python?
- 12. Jak wysłać faks z moją aplikacją Qt?
- 13. Pakowanie SQLite DB z moją aplikacją
- 14. Moja struktura logowania jest na zawsze związana z moją aplikacją!
- 15. Biblioteka SMS w C#
- 16. Jaka jest standardowa biblioteka SOAP do użycia w groovy?
- 17. Czy istnieje standardowa biblioteka puli połączeń Mysql dla języka C?
- 18. Co gwarantuje standardowa biblioteka dla zadania przeniesienia?
- 19. W jaki sposób wiele serwerów współpracuje z aplikacją WWW?
- 20. Standardowa biblioteka C++ do przetwarzania danych na dużą skalę
- 21. Authlogic nie działa z moją aplikacją Rails 3.2
- 22. Standardowa (lub bezpłatna) manipulacja ścieżką POSIX Biblioteka C
- 23. Standardowa dystrybucja normalnej funkcji wartości z C#
- 24. Jak powiązać plik CSV z moją aplikacją w iOS 7
- 25. Standardowa biblioteka .NET kontra .NET Standard
- 26. C++ Standardowa zgodność z AVR-GCC
- 27. Apache: w jaki sposób mogę uzyskać dostęp do mojej strony z komputera poza moją siecią?
- 28. Standardowa niejednoznaczność C++
- 29. Jaki jest poprawny sposób korzystania z bitfields w C?
- 30. W jaki sposób C# wie, jaki jest typ literału?
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
I dodać do tego, mingw łączy statycznie swoją aplikację ze swoją standardową biblioteką C++. – nos
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. –