8

J'ai un projet C++ non géré dans Visual Studio 2010. Il utilise boost, glut et une autre bibliothèque d'un fournisseur.Liaison dynamique et statique et déploiement dans Visual Studio 2010

J'ai mis en place le projet pour créer un exécutable plus "dll-indépendant" possible. Toutes les bibliothèques boost sont liées statiquement et il n'y a pas besoin de DLL dans le répertoire où l'exécutable reste. Même chose pour le Glut, j'ai lié le glut32.lib statique au lieu du glut32.dll et encore aucun problème.

J'ai sélectionné pour les bibliothèques Runtime la version NON-dll, c'est-à-dire la mise au point multithread (pour la configuration de débogage) et la configuration multithread pour la version.

Maintenant, le fournisseur dont je parlais avant, fournit deux alternatives un Vendor.lib et un Vendor.dll. Le Vendor.lib est ajouté dans le Linker-> dépendances supplémentaires mais à l'exécution je dois toujours mettre le Vendor.dll dans le même répertoire de l'exécutable, sinon l'environnement d'exécution se plaint parce qu'il ne trouve pas le Vendor Bibliothèque .dll.

Comment est-ce que je devrais résoudre ce problème? Je voudrais éviter de mettre dans chaque répertoire le fichier .dll.

Je ne veux pas mettre la DLL dans le même répertoire de l'exe et en général quelles sont les directives pour déployer des applications de console C++ non managées dans Visual Studio?

Je sais qu'il y a beaucoup de questions et de pages à propos de cet argument, mais aucun d'entre eux ne m'a éclairci sur ce point.

Une idée?

Répondre

10

Microsoft est un peu drôle dans la façon dont il gère cela: lorsque vous créez un .dll, vous créez également un fichier .lib, qui contient les symboles publics dans le .dll. Vous devez lier le .lib afin de charger le fichier .dll au runtime, mais ce .lib n'est toujours pas une bibliothèque statique. Si votre fournisseur fournit une version pour la liaison statique, il n'y aura pas de fichier .dll, ou deux .lib (vraisemblablement dans des répertoires différents ou avec des noms différents). Juste un autre exemple de Microsoft rendant le développement sérieux plus difficile que nécessaire.

+2

Ceci n'est pas spécifique à MS. Linux a aussi des bibliothèques d'importation. – rubenvb

+8

Unix a deux types de "bibliothèques": les bibliothèques (fichiers .a) et les objets partagés (fichiers .so).Un fournisseur fournissant une bibliothèque (au sens général) fournira normalement les deux. Si vous liez sur le fichier .a, vous liez statiquement, et si vous liez sur le .so, vous liez dynamiquement. Le problème avec la solution Microsoft est que 1) vous avez deux fichiers distincts pour la liaison dynamique, et 2) l'un des fichiers a le même nom qu'une bibliothèque statique. –

+0

Merci pour votre réponse. Je ne suis probablement pas le seul à être confus sur ce sujet. Ainsi, comme vous le dites, il existe deux types de fichiers .lib, l'un créé lorsqu'une bibliothèque dynamique est requise et l'autre pouvant être une bibliothèque statique. Je ne trouve pas un autre fichier Vendor.lib, donc je suppose que je suis dans le premier cas ... Merci! – linello

7

La bibliothèque Vendor.lib doit être une bibliothèque statiquement compilée. Si quand vous liez ceci vous avez toujours besoin de Vendor.dll, cela ressemble à Vendor.lib est en fait une bibliothèque d'importation plutôt qu'une bibliothèque statique.

Vérifiez si le fournisseur fournit un autre Vendor.lib (qui devrait être un peu plus grand que votre fichier .lib actuel), qui est une bibliothèque statique et essayez d'établir une liaison avec celui-ci. Si c'est le cas, vous n'aurez pas besoin de la DLL.

+0

Malheureusement, je n'ai pas d'autres fichiers .lib dans cette bibliothèque, donc je suppose que je suis dans le cas de lien dynamique. Il n'existe aucune autre méthode pour inclure le fichier .dll au lieu de le copier dans le répertoire exécutable (ou de le copier dans le dossier System32?) – linello

+0

Si vous avez accès à la source du fournisseur, vous pouvez compiler le fichier vendor.lib en tant que bibliothèque statique . Sinon, si vous devez utiliser la lib partagée, alors votre exe doit y avoir accès lors de l'exécution, ce qui signifie l'ajouter au dossier avec l'exe, ou le placer dans un dossier qui est inclus dans% PATH% (la convention étant le Dossier System32). – Fraser

Questions connexes