Lorsque j'utilise habituellement le code (Inclure les en-têtes) des bibliothèques de 3ème partie (non standard) C ++, un fichier binaire pré-construit est lié à (ou inclus dans) l'exécutable cible qui représente mon application, mais que se passe-t-il avec C ++ Bibliothèque standard?, aussi loin que j'ai vu, je n'ai pas besoin d'expédier une bibliothèque avec une application utilisée uniquement à partir de la bibliothèque standard C ++, est donc le code statiquement lié et inclus dans l'exécutable? P>
5 Réponses :
La plupart d'entre elles sont toutes dans les fichiers d'en-tête, car il est si fortement modélisé. Très peu requis libstdc ++. Donc code> (
iostream code>, peut-être, je pense). P>
STL est principalement des fichiers d'en-tête. La bibliothèque standard inclut d'autres choses.
Tout C ++ nécessite libstdc ++. Il a des fonctions essentielles dans la norme requises par la norme.
Non, les bibliothèques standard par défaut sont liées de manière dynamique lors de l'exécution. P>
Lors de l'exécution du chargeur dynamique examinera dans quelques endroits standard pour les bibliothèques dynamiques si elle le trouve chargée et fonctionne, sinon l'application quitte. P>
sur les systèmes UNIX:
/ usr / lib: Rechercher: libstdc ++ * p>
sur Windows:
C: \ Windows \ System32 Recherchez: msvcrt.dll p>
Il existe également quelques variables d'environnement pouvant affecter le chemin de recherche. Regardez votre page d'homme de plateformes pour Dlopen pour voir ce qu'ils sont. Tout ce dont vous avez besoin devrait être dans les pages de l'homme pour Dlopen sur votre plate-forme. P>
La plupart des systèmes ont ces libs dans les endroits appropriés et seront automatiquement trouvés.
Le reste de la STL ne présentera pas de dépendances transnationales supplémentaires partagées. P>
Le répertoire est c: \ windows \ system32 code>. Au moins, c'est là que les roulements de studio visuels sont conservés. Je ne pense pas que Mingw lie à eux.
Et pour ajouter à cela, MINGW relie votre application à sa bibliothèque standard C ++ statique.
Cette réponse n'est pas entièrement correcte. libstdc ++ n'est pas la même chose que msvcrt.dll. Ce dernier est la bibliothèque C i>, le premier est la bibliothèque C ++ i>. Il est vrai que chaque binaire produit par Mingw dépendra de MSVCRT.DLL, mais cela n'a rien à voir avec la question qui a été posée. Comme je l'ai signalé ci-dessous et que les NOS indiquent dans le commentaire précédent, la bibliothèque LIBSTDC ++ est par défaut liée statiquement dans votre exécutable.
De plus, MSVCRT.DLL est le runtime Visual Studio 6 (VC98) C. Les versions plus récentes ont des numéros de version dans le nom, par ex. Msvcrt90.dll, et ils sont installés dans un dossier "SXS".
msvcrt.dll code> est pas b> une bibliothèque de temps d'exécution C ++, il s'agit d'une bibliothèque d'exécution C. La bibliothèque de temps d'exécution C ++ est
msvcp60.dll code>.
@RustyX: Oui. Msalters a mentionné qu'il y a 3 ans.
@Loki Astari, personne n'a déjà mentionné le temps d'exécution réel C ++. Msvcrt90.dll est également une heure d'exécution C. MSVCP ... DLL B> est le temps d'exécution C ++.
@Rustyx: Bien sûr. Vous avez raison. Il suffit de 3 ans de retard et déjà mentionné plusieurs fois plus haut.
Ce comportement est-il égal à implicite -lstdc ++ code> param?
La seule dépendance de base de l'exécution pour les programmes MINGW C ++ est sur msvcrt.dll. D'autres dépendances dépendront de ce que votre programme fait réellement - par exemple, s'il utilise la connectivité de la base de données ODBC, elle sera Dépend de ODBC32.DLL (et probablement d'autres dlls Windows). Cependant, utiliser des classes comme STD :: String ou STD :: Vector dans un programme Mingw C ++ ne présentera pas de nouvelles dépendances de la bibliothèque dynamique. P>
Si vous êtes inquiet des dépendances de la bibliothèque dynamique, vérifiez L'outil "Walker de dépendance" chez http://www.dependencywalker.com/ p>
Dans les versions récentes MINGW GCC / G ++ (4.40) Vous pouvez créer un lien avec une DLL partagée plutôt que la bibliothèque statique par défaut à l'aide du drapeau -Shared-libstdc ++. P>
Les versions statiques de la bibliothèque sont situées dans / Mingw / Lib / GCC / MINGW32 / [Version GCC]. Le nom du fichier est libstdc ++. Une. Ceci sera lié par défaut lors de la compilation d'une application C ++ avec Mingw. P>
La valeur par défaut pour Mingw semble avoir été modifiée, du moins sur mon système, il s'agit d'un lien avec LibstDC ++ - 6.DLL par défaut. Il peut être désactivé avec un drapeau -Static-libstdc ++ code>.
@Rustyx C'est bon à savoir. N'hésitez pas à modifier ma réponse pour refléter cela (et donner à la réponse à une uppote afin qu'elle flotte au sommet;)
@RustyX J'ai essayé -Static-libstdc ++ (et -Static-Libgcc) et pourtant mon programme reste dynamiquement des liens dynamiquement vers les bibliothèques Mingw LibStd * .dll. Je suis en train de compiler une idée de la raison pour laquelle?
@Rustyx: Votre réponse a gourné mon problème de liaison. Merci!
Les bibliothèques d'exécution C et C ++ sont liées de la même manière que les bibliothèques normales, la principale différence est qu'elles sont généralement automatiquement compilées et liées par le compilateur et la liaison sans avoir besoin de les spécifier. P>
Il est toutefois incorrect, de généraliser que vous n'avez pas à les expédier avec votre application. Dans la plupart des cas où vous expédiez des fichiers binaires liés dynamiquement, vous devrez les inclure, par exemple si vous compilez avec MSVC ++, vous trouverez un lien avec tout ce qui est installé sur votre machine de construction, si vous installez le binaire lié dynamiquement sur une installation de Windows fraîche, vous sont susceptibles de rencontrer des problèmes à moins que vous vous assurez que les bibliothèques sont incluses dans le cadre de l'installation InstallPack (voir la documentation sur Visual Studio Redistributables). Il en va de même pour les machines Solaris (les bibliothèques standard sont améliorées dans le cadre d'un ensemble de correctifs). Avec Linux, il est plus compliqué, vous ne pouvez pas être associé statiquement en raison de la GPL, mais les bibliothèques sont généralement installées via des packages de distribution. P>
Une bonne réponse, mais je parlais de Mingw, qui arrive à lier des bibliothèques standard statiquement ...