comment éviter de “déjà défini erreur” en C++
Je suis gettings ce type d'erreurs dans une MFC VS6 projet tout en reliant l'application:
msvcrt.lib(MSVCRT.dll) : error LNK2005: _atoi already defined in LIBC.lib(atox.obj)
Je sais ce que cela signifie (une fonction existe en 2 différentes bibliothèques); pour le résoudre, je devrait avoir à l'exclusion d'un des 2 bibliothèques (msvcrt.lib
ou libc.lib
).
Mais si je fais cela, il y a toutes sortes d'erreurs externes non résolus. Donc, je voudrais continuer à l'utiliser à la fois des bibliothèques.
Est-il possible de dire à l'éditeur de liens que je veux utiliser le _atoi
fonction dans libc.lib
et pas dans msvcrt.lib
(ou l'inverse)?
Toute aide ou une orientation serait génial.
Vous devez vous connecter pour publier un commentaire.
Cette erreur signifie certainement que vous êtes entre deux morceaux de codes qui ont été compilées à l'aide d'exécution distinct des bibliothèques. MSVCRT.dll est la version dynamique, tandis que la LIBC.lib est la statique. Si vous faites cela, l'enfer se détacher. Essayez de trouver les parties de votre code d'utilisation de la version, et de régler cette question.
Vous avez un moteur d'exécution de choc. À l'aide de plusieurs bibliothèques d'exécution est généralement une mauvaise chose.
Vous pouvez utilisez /nodefaultlib:msvcrt (ou /nodefaultlib:libc) dans votre linker options d'exclure l'un ou l'autre.
En fait, avant d'avoir recours à cette, vérifiez les paramètres de votre projet. Si je me souviens bien, la libc est le seul thread d'exécution dans VS6, et msvcrt est le multi-thread d'exécution. Si vous avez plusieurs projets dans votre solution, assurez-vous qu'ils sont tous à l'aide de l'un ou de l'autre.
Il semble y avoir une option que vous pouvez utiliser pour ignorer les erreurs de ce type: dans projectsettings > lien > vérifiez la Force du fichier de sortie". Cela permet de générer le programme même si il y a linkerrors.
La sortie de génération donne quelque chose comme ceci:
msvcrt.lib(MSVCRT.dll) : avertissement LNK4006: _atoi déjà défini dans la LIBC.lib(atox.obj); deuxième définition ignorée
Bien sûr, vous aurez besoin d'utiliser cette option avec prudence car elle peut générer une application qui ne fonctionne pas dans certains cas, mais ici, il n'a sans doute pas plus mal (je l'espère).
Merci pour les autres réponses, mais qui ne semble pas être une option dans mon cas particulier.