web-dev-qa-db-fra.com

'LIBCMT' entre en conflit avec l'utilisation d'autres bibliothèques + symboles externes non résolus

J'ai un programme utilisant OpenGL 3.2 (+ libs) et FreeType2. Puis un autre programme avec Boost et OpenSSL. Le côté OpenGL était de s'assurer que le texte pouvait être rendu et le programme boost/openssl devait faire un serveur de connexion/jeu sécurisé.

Les deux programmes fonctionnent bien par eux-mêmes.

Cependant, l'ajout de Boost et d'OpenSSL au projet de jeu (GL + freetype) a entraîné l'échec de la liaison.

J'ai lié les bibliothèques suivantes ainsi que l'inclusion d'un dossier inclus.

glimg.lib glutil.lib glfw.lib opengl32.lib freetype.lib glew32.lib user32.lib libeay32.lib ssleay32.lib

L'erreur de l'éditeur de liens est.

1>LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library
1>libeay32.lib(cryptlib.obj) : error LNK2001: unresolved external symbol __imp__DeregisterEventSource@4
1>libeay32.lib(cryptlib.obj) : error LNK2001: unresolved external symbol __imp__ReportEventA@36
1>libeay32.lib(cryptlib.obj) : error LNK2001: unresolved external symbol __imp__RegisterEventSourceA@8
1>libeay32.lib(Rand_win.obj) : error LNK2001: unresolved external symbol __imp__DeleteDC@4
1>libeay32.lib(Rand_win.obj) : error LNK2001: unresolved external symbol __imp__DeleteObject@4
1>libeay32.lib(Rand_win.obj) : error LNK2001: unresolved external symbol __imp__GetBitmapBits@12
1>libeay32.lib(Rand_win.obj) : error LNK2001: unresolved external symbol __imp__BitBlt@36
1>libeay32.lib(Rand_win.obj) : error LNK2001: unresolved external symbol __imp__GetObjectA@12
1>libeay32.lib(Rand_win.obj) : error LNK2001: unresolved external symbol __imp__SelectObject@8
1>libeay32.lib(Rand_win.obj) : error LNK2001: unresolved external symbol __imp__CreateCompatibleBitmap@12
1>libeay32.lib(Rand_win.obj) : error LNK2001: unresolved external symbol __imp__GetDeviceCaps@8
1>libeay32.lib(Rand_win.obj) : error LNK2001: unresolved external symbol __imp__CreateCompatibleDC@4
1>libeay32.lib(Rand_win.obj) : error LNK2001: unresolved external symbol __imp__CreateDCA@16
1>.\BasicTexture.exe : fatal error LNK1120: 13 unresolved externals

La bibliothèque d'exécution est définie sur Multi-thread DLL (/ MD)

Je ne sais pas quoi faire, j'apprécierais vraiment toute aide.

17
Andrew

Des messages d'erreur externes non résolus sont générés lorsque le compilateur génère du code référençant des objets ou des fonctions définis en externe et que l'éditeur de liens ne parvient pas à les trouver. Pour générer du code appelant une fonction, le compilateur n'a besoin que d'une déclaration:

extern "C" BOOL DeregisterEventSource ( HANDLE hEventLog );

Ces informations sont suffisantes pour produire une instruction call (à l'exception de l'adresse cible). Le mot clé extern informe le compilateur que l'implémentation est définie ailleurs. Par conséquent, il ne peut pas connaître l'adresse cible qui doit être renseignée ultérieurement. Lorsque le compilateur a terminé, c'est le travail du lieur de connecter les morceaux ensemble. Il utilise les informations recueillies dans les bibliothèques d'importation pour rechercher les décalages requis.

Les appels de l'API Windows sont facilement repérés dans le journal des erreurs. Ils ont un __imp__ préfixe et parfois un A ou W suffixe suivi de @<n> <n> indique le nombre d'octets requis pour les arguments. Dans le cas d'un appel API Windows, vous pouvez ensuite rechercher la fonction dans le MSDN (comme DeregisterEventSource ). Vers le bas se trouvent les Exigences où vous pouvez trouver le nom de la bibliothèque d'importation.

L'avertissement de conflit indique que tous les modules n'utilisent pas la même bibliothèque d'exécution. Même s'il ne s'agit que d'un avertissement, il s'agit d'un problème grave qui devrait être résolu. Vous obtenez cet avertissement si vous mélangez /MD et /MT commutateurs du compilateur, mais aussi, si vous mélangez des bibliothèques d'exécution et de débogage (comme /MD et /MDd). Pour diagnostiquer ce message, vous pouvez utiliser le /VERBOSE:LIB commutateur de l'éditeur de liens pour déterminer les bibliothèques que l'éditeur de liens recherche. Des informations supplémentaires sur cet avertissement peuvent être trouvées sur ceci lien MSDN .

22
IInspectable

Vous essayez de compiler avec /MD, ce qui est probablement le bon choix, mais du code (probablement l'une des bibliothèques) a été construit avec /MT, et vous ne pouvez pas avoir les deux dans le même programme. Vous devez déterminer quelle bibliothèque a été créée avec /MT et reconstruisez-le avec /MD.

24
Adrian McCarthy