2011-11-11 3 views
1

J'utilise VS2010 et J'ai un projet C++ qui référence et utilise une bibliothèque C externe (dll) en ayant diverses entrées dans les sections VC++ Directories et Linker de les propriétés du projet.Comment compiler une bibliothèque statique? ("-static-lib ..." équivalent?)

En ce moment, mon projet est la construction, mais quand il démarre, une boîte de message apparaît:

Le programme ne peut pas démarrer car ExternalCLibrary.dll est absent de votre ordinateur. [...]


Je voudrais savoir comment faire dans Visual Studio 2010 l'équivalent de

ajoutant "-static-libgcc -static-libstdc++" à vos drapeaux du compilateur.

Il semble être la solution selon: The program can't start because libgcc_s_dw2-1.dll is missing

+0

@MichaelPrice: désolé, clarifié: p – ibiza

+0

Alors, où est cette DLL? Si ce n'est pas dans votre répertoire .exe, Windows a de très faibles chances de le trouver. Les propriétés du projet n'aident pas, elles ne sont utilisées qu'au moment de la construction, pas au moment de l'exécution. –

+0

@HansPassant: La DLL est dans le répertoire/lib, par rapport à l'exe. Comment puis-je le spécifier dans mon programme? Je ne le veux pas dans le même répertoire de l'exe ... – ibiza

Répondre

2
  1. Chargez votre projet dans Visual Studio.
  2. Faites un clic droit sur votre projet et choisissez Propriétés.
  3. Localisez la partie "Linker" de l'arborescence sur la gauche .
  4. Choisissez toutes les configurations et toutes les plates-formes dans les menus déroulants situés en haut de la boîte de dialogue.
  5. Mettez votre bibliothèque statique supplémentaire dépendances dans le champ Entrée -> Dépendances supplémentaires champ, délimité par des points-virgules.
  6. Si les bibliothèques ne se trouvent pas sur votre chemin de recherche lib, saisissez les entrées appropriées dans le champ Général -> Répertoire de bibliothèques supplémentaires, délimité par le point-virgule .
  7. Appliquer, enregistrer, compiler, exécuter.
+0

il semble qu'il n'y ait que le champ 'Bibliothèques supplémentaires' et pas le champ 'Bibliothèques supplémentaires'. http://i.imgur.com/Oqx9R.png – ibiza

+0

@ibiza Désolé ... certains noms étaient erronés car je tapais de la mémoire ... éditer maintenant. –

+1

En outre, ce sont les instructions pour ajouter une dépendance sur une bibliothèque. Si ce fichier .lib statique est associé à un fichier .dll, le fichier .dll devra figurer dans le chemin de recherche exécutable de l'exécutable (probablement dans le même répertoire que l'exécutable). –

0

Vous ne pouvez pas utiliser dll en tant que bibliothèque statique (c'est pourquoi ils s'appellent Dynamic-link library). Afin de compiler une bibliothèque statique, vous aurez le code source de cette bibliothèque. Une fois que vous avez le code source, allez dans Paramètres du projet, General->Configuration Type et réglez le sur Static Library(.lib). Ensuite, dans votre programme, vous devrez ajouter cette bibliothèque en mettant le nom de la bibliothèque dans Linker->Input->Additional Dependencies

+0

okay, je l'ai déjà fait aussi, j'ai dll et bibliothèque paramètres corrects dans mon propriétés du projet. Comment puis-je indiquer à mon programme d'utiliser les versions statiques? – ibiza

+0

Vous n'avez pas besoin de. Il suffit d'inclure ce nom de bibliothèque dans 'Linker-> Input-> Additional Dependencies' et d'inclure les fichiers d'en-tête, et d'utiliser les fonctions. – JosephH

+0

Reportez-vous à http://msdn.microsoft.com/en-us/library/ms235627.aspx pour les étapes complètes – JosephH

0

Les deux indicateurs passés à gcc selon votre question disent à gcc de lier statiquement la bibliothèque d'exécution à un exécutable ou à une bibliothèque/dll partagée . Cela est peu susceptible d'être le problème avec votre problème car la partie du message d'erreur que vous avez cité suggère que ExternalCLibrary.dll n'est pas généré correctement.

Si la DLL existe, utilisez un outil tel que Dependency Walker pour déterminer quelle dépendance de votre DLL ne peut pas être chargée; c'est le coupable probable. Si ExternalCLibrary.dll n'existe pas, alors vous devez trouver d'où vous êtes censé l'obtenir, mais si votre projet se construit et qu'il est listé dans le projet en tant que dépendance, je suppose que c'est un problème avec le chargeur ne peut pas trouver une dépendance de cette DLL lors de l'exécution.

+0

Salut et merci, ExternalCLibrary.dll est construit correctement, comme si j'ajoute le chemin où mon dll est à la variable d'environnement PATH, l'application entière fonctionne – ibiza

+0

Cela aurait du sens, car le chargeur vérifie la variable de chemin pour les DLL qui ne se trouvent pas dans le répertoire en cours. Vous pouvez envisager de configurer votre projet pour que toutes les DLL dépendantes se retrouvent dans le même directeur. y comme l'application principale pour éviter ce problème. –

0

Ce processus est simple, mais vous devez être conscient de plusieurs choses. La première chose, si votre lib est écrit en C, dans les fichiers d'en-tête de toutes les sources contenant C, nous avons ce qui suit.

#ifdef __cplusplus 
extern "C" { 
#endif 

// C functions 

#ifdef __cplusplus 
} 
#endif 

Une fois que vous avez fait, compilez la bibliothèque dans une bibliothèque statique à l'aide du ar rcs [YOUR OBJECT FILES]. La dernière chose à faire est de nous le compilateur C++ lier la bibliothèque avec les fichiers objets de votre projet. Maintenant, des drapeaux sont requis pour lier la bibliothèque.

Questions connexes