11

Ich habe ein Programm mit OpenGL 3.2 (+ libs) und FreeType2. Dann ein anderes Programm mit Boost und OpenSSL. Die OpenGL-Seite sollte sicherstellen, dass Text gerendert werden kann, und das boost/openssl-Programm soll einen sicheren Login/Spielserver ausführen.'LIBCMT' Konflikte mit der Verwendung von anderen Bibliotheken + ungelösten externen Symbolen

Beide Programme funktionieren gut von ihnen selbst.

Das Hinzufügen von Boost und OpenSSL zum Spiel (GL + freetype) führte jedoch dazu, dass die Verknüpfung fehlschlug.

Ich habe die folgenden Bibliotheken verknüpft sowie einschließlich enthält Ordner.

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

Der Linker Fehler.

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 [email protected] 
1>libeay32.lib(cryptlib.obj) : error LNK2001: unresolved external symbol [email protected] 
1>libeay32.lib(cryptlib.obj) : error LNK2001: unresolved external symbol [email protected] 
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol [email protected] 
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol [email protected] 
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol [email protected] 
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol [email protected] 
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol [email protected] 
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol [email protected] 
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol [email protected] 
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol [email protected] 
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol [email protected] 
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol [email protected] 
1>.\BasicTexture.exe : fatal error LNK1120: 13 unresolved externals 

Laufzeitbibliothek ist mit Multi-Thread-DLL (/ MD) gesetzt

Ich habe keine Ahnung, was ich wirklich zu tun jede mögliche Hilfe schätzen würde.

+3

Die nicht aufgelösten externen Daten werden nicht mit den erforderlichen Bibliotheken verknüpft ('Advapi32.lib' und' Gdi32.lib'). Die erste Warnung gibt an, dass Ihr Projekt und einige der Bibliotheken, die Sie verknüpfen, inkompatible Linkereinstellungen in Bezug auf das CRT haben. Abgesehen davon scheint es, dass Sie keinen Unicode-Build kompilieren. Gibt es einen Grund dafür? – IInspectable

+0

Danke Tim. Nicht sicher auf dem Unicode-Zeug Ich habe nur premake4 verwendet, um die vs-Lösung zu machen und änderte alles, was ich brauchte (ich habe ja für Unicode ausgewählt). Möchten Sie, dass es eine Antwort gibt, weil Sie es behoben haben! der Build ist gelungen. VIELEN DANK! :) – Andrew

Antwort

13

Nicht aufgelöste externe Fehlermeldungen werden erzeugt, wenn der Compiler Code referenziert, der auf extern definierte Objekte oder Funktionen verweist und der Linker diese nicht finden kann. So generieren Sie Code einen Funktionsaufruf der Compiler benötigt nur eine Erklärung Aufruf:

extern "C" BOOL DeregisterEventSource (HANDLE hEventLog); 

Dies ist genug, um Informationen eine call Anweisung zu erzeugen (mit Ausnahme der Zieladresse). Das Schlüsselwort extern informiert den Compiler, dass die Implementierung an anderer Stelle definiert ist. Folglich kann es die Zieladresse, die später ausgefüllt werden muss, nicht kennen. Wenn der Compiler fertig ist, ist es die Aufgabe des Linkers, die Teile miteinander zu verbinden. Es verwendet die Informationen, die von den Importbibliotheken gesammelt werden, um die erforderlichen Offsets nachzuschlagen.

Windows-API-Aufrufe werden im Fehlerprotokoll leicht erkannt. Sie haben ein __imp__ Präfix und manchmal ein A oder W Postfix gefolgt von @<n>, wobei > die Anzahl der Bytes angibt, die für die Argumente benötigt werden. Im Fall eines Windows-API-Aufrufs können Sie dann die Funktion in der MSDN nachschlagen (wie DeregisterEventSource). Nach unten sind die Anforderungen, wo Sie den Namen der Importbibliothek finden können.

Die Konfliktwarnung zeigt an, dass nicht alle Module dieselbe Laufzeitbibliothek verwenden. Obwohl dies nur eine Warnung ist, ist es ein ernstes Problem und sollte gelöst werden. Diese Warnung erhalten Sie, wenn Sie /MD und /MT Compiler-Switches mischen, aber auch, wenn Sie Release- und Debug-Laufzeitbibliotheken mischen (wie /MD und /MDd).Um diese Nachricht zu diagnostizieren, können Sie den /VERBOSE:LIB Linker-Schalter verwenden, um zu bestimmen, welche Bibliotheken der Linker durchsucht. Weitere Informationen zu dieser Warnung finden Sie unter MSDN link.

+1

+1 für die Erkenntnis, dass das Präfix __imp__ einen Windows-API-Aufruf impliziert. Ich habe dieses Präfix zuvor in Linker-Fehlern gesehen, wusste aber nicht, warum es dem Symbol vorangestellt wurde. – riderBill

16

Sie versuchen, mit /MD zu kompilieren, das ist wahrscheinlich die richtige Wahl, aber einige Code (wahrscheinlich eine der Bibliotheken) wurde mit /MT gebaut, und Sie können es nicht beide Möglichkeiten im selben Programm haben. Sie müssen herausfinden, welche Bibliothek mit /MT erstellt wurde und es mit neu erstellen.

+1

oder, wenn Sie keine Quelle für den Übeltäter lib haben, verknüpfen Sie Ihr Projekt mit '/ MT' – AShelly

+0

Danke für die Antwort, Das Problem wurde von Tim im Kommentar zu der Frage über eine Stunde gelöst. Ich möchte ihm die Antwort annehmen lassen. Jedoch +1. Weil ich überprüft habe, dass alles MD-Thread war, bevor ich die Frage posten konnte. – Andrew