2016-06-10 10 views
0

Also brauche ich eine indiotensichere App. Ich habe es getan, aber wenn ich versuche, es innerhalb einer nackten Windows 7 virtuellen Maschine zu starten, habe ich viele Fehler wie msvcp140.dll fehlt etc. etc. so suchte ich Google, um diese statisch zu verknüpfen. Ich fand, dass ich es in Projektcode-Generierungsoptionen ändern sollte, also tat ich es. Ich habe auch SFML statisch verbunden. Das Problem ist, ich habe eine Menge Linkerfehler erhalten beziehen wie SFML:(Visual Studio) Viele Linker-Fehler beim Versuch, Microsoft-Bibliotheken statisch mit SFML-Bibliotheken zu verbinden

sfml-system-s.lib(String.cpp.obj) : error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MD_DynamicRelease' doesn't match value 'MT_StaticRelease' in main.obj 

Ich bin nicht sicher, warum es passiert, so dass ich um Hilfe bitte hier

+0

Der einfachste Weg wäre, es mit einem anderen Compiler zu kompilieren (siehe die Anweisungen auf der SFML-Website), so dass Sie nicht die Microsoft-Bibliotheken benötigen, die der Compiler von Visual Studio benötigt. Oder nehmen Sie einfach diese .dlls in Ihre Anwendung auf, vorausgesetzt, Sie sind nicht nur auf Ihre ausführbare Datei beschränkt. – Noctiphobia

+0

@Noctiphobia das Problem ist, ich muss Visual Studio verwenden, weil meine app sowohl SFML und winapi verwendet (winapi wird verwendet, um zu definieren, wie sfml Fenster hier aussieht) so muss ich Visual Studio verwenden jetzt denke ich einfach nicht kompilieren sfml mit cmake aber ich habe einen Compiler nicht gefunden und cxx Compiler nicht gefunden, ich bin mir nicht sicher, warum, aber ich werde versuchen, es herauszufinden –

Antwort

0

ich ziemlich sicher war, dass ich das Problem habe gedacht nur durch Lesen der Fehlermeldung, Nachdenken über den Begriff "RuntimeLibrary", und wie es gesagt wurde, dass es eine Diskrepanz zwischen "DynamicRelease" und "StaticRelease" gab. Meine Intuition sagte, dass Sie versuchten, eine Bibliothek, die für eine Version des CRT kompiliert wurde, mit einer Anwendung zu kombinieren, die auf eine andere Version des CRT abzielte. Da "MD" und "MT" Compiler-Schalter sind, die steuern, ob Sie die Laufzeit dynamisch oder statisch verknüpfen, ist das ein ziemlich guter Anhaltspunkt.

Aber nur um sicher zu sein, nahm ich den tatsächlichen Fehlercode (LNK2038) und schaute es in the documentation. Sicher genug, enthält es eine Passage, die das Problem genau beschreibt:

Runtime

Gibt die Version des C++ Standard Library und C-Laufzeit, die von einer App oder eine Bibliothek verwendet wird. Code, der eine Version der C++ - Standardbibliothek oder C-Laufzeit verwendet, ist nicht kompatibel mit Code, der eine andere Version verwendet. Weitere Informationen finden Sie unter /MD, /MT, /LD (Use Run-Time Library).

Der Linker ist im Laufe der Jahre intelligent geworden. Es versucht dich vor einem schwerwiegenden Fehler zu schützen. Alle Module, die miteinander verbunden werden, müssen kompiliert worden sein, um den gleichen Typ von Laufzeitbibliothek anzusprechen. Wenn Sie möchten, dass die App statisch mit dem CRT (/ MT) verknüpft, müssen Sie die Bibliothek auch statisch verknüpfen (/ MT).
Projekteigenschaften → Konfigurationseigenschaften → C/C++ → Codegenerierung → Laufzeitbibliothek.
Vergessen Sie nicht, alle neu zu erstellen.

+0

Ich bin mir nicht sicher, was soll ich tun, ist die Erklärung ein bisschen unklar für mich. –

+0

In Projekteigenschaften → Konfigurationseigenschaften → C/C++ → Codegenerierung → Laufzeitbibliothek Ich habe/mt überprüft und ich verwende statische Version von sfml –

+0

Sie müssen ändern, wie die * Bibliothek * kompiliert wird, nicht nur die App. Das ist der Punkt, an dem sie übereinstimmen müssen. –