it-swarm.com.de

LNK2038: Keine Übereinstimmung für 'RuntimeLibrary' festgestellt: Der Wert 'MT_StaticRelease' stimmt nicht mit dem Wert 'MD_DynamicRelease' in file.obj überein

Ich füge Matlab, C und Cuda zusammen in ein Projekt ein. Ich habe Matlab-Mix verwendet, um die in c geschriebene Matlab-MX-Funktion mit der cuda-Laufzeitbibliothek zu verbinden. Es wird ein Verknüpfungsfehler über einen Konflikt bei der statischen Freigabe und der dynamischen Freigabe zwischen der C-Datei und der Bibliothek angezeigt. Kann jemand das lösen? 

error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MD_DynamicRelease' in file.obj. 
36
Ahmed Hassan

Die Bibliothek und Ihr Projekt müssen in Bezug auf die C-Laufzeitbibliothek mit denselben Einstellungen verknüpft sein.

In Ihrem Fall wurde einer mit dem CRT DLL (/ MD) und der andere statisch (/ MT) verknüpft.

Sie müssen nur sicherstellen, dass sowohl Übereinstimmung als auch dieser Fehler entfernt wird.

46
tux3

Dieser Fehler kann auftreten, wenn Sie statisch Ihr Projekt mit einer Bibliothek (in der Regel eine Datei mit der Erweiterung .lib) verknüpfen, die Linker-Einstellung in Ihrem Visual Studio-Projekt jedoch auf dynamisch gesetzt ist zur Laufzeit auftreten, normalerweise mit einer DLL-Datei).

Um festzulegen, dass das Projekt statische Verknüpfungen verwenden muss, starten Sie Visual Studio. Klicken Sie im Bereich Projektmappen-Explorer mit der rechten Maustaste auf den Projektnamen und wählen Sie Eigenschaften aus. Erweitern Sie die Eigenschaften wie in der folgenden Abbildung gezeigt: C/C++ -> Codegenerierung -> Laufzeitbibliothek, wählen Sie die Option Multi-threaded (/MT) im Dropdown-Menü . enter image description here

27
Rahav

zum Teilen Zweck.

Ich verwende die Version 2017 VS, die eine alte Lösung von 2008 erfolgreich öffnet und ausführt. Wenn Sie nun aus irgendeinem Grund alle Bibliotheken und Ihr Hauptprojekt so ändern, dass sie den gleichen Parameter für die Laufzeitbibliothek haben (unter Eigenschaften, siehe obige Poster), aber immer noch dieselbe Fehlermeldung erhalten, versuchen Sie, jede einzelne .vcxproj-Datei zu öffnen . Suchen Sie unter "RuntimeLibrary" und machen Sie ihren Wert in allen vcxproj-Dateien gleich. Aus irgendeinem Grund werden diese vcxproj-Dateien niemals auf den gleichen Wert aktualisiert, den ich in den Eigenschafteneinstellungen angegeben habe, und ich muss sie manuell in vcxproj ändern.

Optional können Sie, wenn Sie möchten, auch die vcproj-Dateien öffnen und ihre "RuntimeLibrary" ebenfalls ändern. Hier ist der Wert in Ziffern.

3
GWKit

Wie bereits erwähnt, muss der Schalter für die Laufzeitbibliothek auf cl.exe für alle kompilierten Module zutreffen. In MSBuild wird dies als ClCompile>/RuntimeLibrary bezeichnet.

Selbst wenn diese übereinstimmen, tritt dieses Problem möglicherweise weiterhin auf, wenn sich irgendwo in Ihrem Projekt ein "#undef DEBUG" oder "#undef _DEBUG" befindet. Der Header yvals.h, der Teil der Header der VC++ - Laufzeitbibliothek ist, kann ändern, was in Ihren obj-Dateien kompiliert wird, wenn diese Makros geändert werden.

Verwenden Sie "dumpbin/all foo.obj> foo.txt", um zu überprüfen, was in Ihren obj-Dateien tatsächlich vor sich geht. Suchen Sie in dieser Ausgabe nach der Überschrift "Linker Directives".

0
hoopyfrood

Dies würde als Kommentar zu GWKit besser funktionieren, aber ich habe nicht den Ruf dafür. Er erwähnt, dass er die vcxproj-Dateien aktualisieren muss, da sie sich nicht wirklich ändern. In meinem Fall wurden sie nur gespeichert, nachdem "saveAll" gedrückt und das Visual Studio geschlossen wurde. Ich habe eine Eingabeaufforderung gefragt, ob ich Änderungen an den Eigenschaften speichern möchte, die gespeichert wurden. Nach dem Klicken auf "Ja" wurden die Vcxproj-Dateien ordnungsgemäß aktualisiert.

0
Jonah Simon