Question

Je ne sais pas s'il est possible de le faire, mais j'aimerais que le / nodefaultlib soit appliqué à un projet de bibliothèque statique.

J'ai de nombreux projets d'application (a.exe, b.dll, c.dll) qui utilisent une bibliothèque statique commune d.lib. Cette bibliothèque a beaucoup de code et a également d'autres dépendances .BIB. L'un d'eux est la bibliothèque OpenSSL, qui semble avoir été construite pour Win32 contre la version de version du CRT (je n'ai pas le projet / sources d'origine).

Jusqu'à présent, pour éviter le mélange des versions de libération / débogage de CRT, je dois mettre la directive / NodeFaultLib:Msvcrt.lib dans tous les projets de feuilles (a.exe, b.dll). Cela fonctionne mais je pense que ce n'est pas le moyen idéal de traiter ce problème. J'ai essayé de mettre cette propriété dans le projet D.Lib, mais cela n'a aucun effet.

Existe-t-il un moyen de forcer MSVC ++ à ignorer la dépendance MSVCRT.LIB de la bibliothèque tierce?

Était-ce utile?

La solution

Un .lib n'a pas de paramètres de linker parce que vous ne le liez pas, vous liez à ce. Un .lib est juste une archive de fichiers .obj, un peu comme un fichier .zip non compressé - c'est pourquoi vous devez mettre le paramètre sur tous les projets qui s'y connectent.

Si vous utilisez VS2005 +, vous pouvez utiliser des feuilles de propriété afin que vous n'ayez à mettre le paramètre qu'en un seul endroit, puis à utiliser cette feuille de propriété dans tous les projets.

Cependant, OpenSSL n'est que cela - Open Source, vous devriez donc pouvoir obtenir la source de la version que vous utilisez et la construire à nouveau (et l'ajouter à votre système de contrôle de version bien sûr). Je pensais que OpenSSL pourrait être construit en tant que DLL ou LIB, ce qui résoudrait votre problème car la DLL n'interférerait pas avec la liaison de votre code.

À défaut, vous avez toujours la possibilité de retirer vos fonctionnalités dans une DLL distincte afin que vous n'ayez des problèmes avec un seul projet.

Autres conseils

Ma compréhension est que si la bibliothèque lib dans lié statiquement dans une DLL, la DLL contient déjà tout le code pertinent de LiB. Par conséquent, ce couplage ne peut pas être supprimé. Ceci est simplement basé sur ma compréhension de la liaison statistique, et non sur les expériences.

Pour empêcher votre bibliothèque de liens statiques distribués en fonction d'une bibliothèque d'exécution MSVC spécifique, vous devez définir cette option de compilateur (dans Visual Studio 2010, il ressemble):

Propriétés de configuration -> C / C ++ -> Advanced -> omettre le nom de la bibliothèque par défaut = oui (/ zi)

Désormais, vos utilisateurs peuvent créer un lien vers votre version Built STATIC LIB à partir de leur version de débogage et ne pas essayer de créer un lien vers la bibliothèque d'exécution incorrecte causant des problèmes, ainsi que des avertissements de liens.

Remarque qui peut entraîner des erreurs de liaison si votre bibliothèque dépend réellement d'une bibliothèque d'exécution spécifique ou de son comportement et que les composants compatibles ne sont pas fournis d'une autre manière.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top