SDL2 + CUDA in MS Visual Studio Express 2013 C++ | Kompiler

Neko

Grünschnabel
Hallo liebe Gemeinde.
Zu Allererst:
Ich arbeite in Windows 7 mit "Microsoft Visual Studio Express 2013 c++ für Windows Desktop"
Außerdem habe ich auch die 2012 Version installiert [aufgrund von CUDA]
SDL2 Version: 2.0.0
CUDA SDK Version: v6.0
Windows sowie die beiden IDE's und Compiler sind auf dem neuesten Stand [16.10.2014]

Ich habe folgende 2 Probleme:
1. Kann ich pure SDL2 Projekte nicht mit der /MT einstellung Kompilieren
Folgende Fehlermeldungen erscheinen:

Code:
2>LIBCMT.lib(crt0init.obj) : warning LNK4098: Standardbibliothek "msvcrt.lib" steht in Konflikt mit anderen Bibliotheken; /NODEFAULTLIB:Bibliothek verwenden.
2>msvcrt.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) ist bereits in LIBCMT.lib(typinfo.obj) definiert.
2>msvcrt.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) ist bereits in LIBCMT.lib(typinfo.obj) definiert.
2>msvcrt.lib(MSVCR120.dll) : error LNK2005: _exit ist bereits in LIBCMT.lib(crt0dat.obj) definiert.
2>msvcrt.lib(MSVCR120.dll) : error LNK2005: ___iob_func ist bereits in LIBCMT.lib(_file.obj) definiert.

Mit der Einstellung /MD funktionieren meine SDL2 Applikationen einwandfrei, jedoch nur auf Computern auf denen auch MSVS installiert ist.

Ich habe bereits erfolglos im Internet nach einer Lösung gesucht.
und für die "Was ist deine Frage?" Menschen unter uns:
Wie muss ich SDL Kompilieren um es auch auf anderen Computern zum laufen zu bekommen?

und mein Zweites Problem wäre folgendes:
Auch CUDA Anwendungen kann ich problemlos Kompilieren und ausführen, sobald ich jedoch die SDL.h sowie deren Bibliotheken einbinde (SDL2.lib & SDL2main.lib) gibt der Compiler Fehlermeldungen aus und weigert sich mir ein Programm aus zu spucken.
Hier wieder die Fehlermeldungen:
Code:
3>LIBCMT.lib(crt0init.obj) : warning LNK4098: Standardbibliothek "msvcrt.lib" steht in Konflikt mit anderen Bibliotheken; /NODEFAULTLIB:Bibliothek verwenden.
3>msvcrt.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) ist bereits in LIBCMT.lib(typinfo.obj) definiert.
3>msvcrt.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) ist bereits in LIBCMT.lib(typinfo.obj) definiert.
3>msvcrt.lib(MSVCR120.dll) : error LNK2005: _exit ist bereits in LIBCMT.lib(crt0dat.obj) definiert.
3>msvcrt.lib(MSVCR120.dll) : error LNK2005: ___iob_func ist bereits in LIBCMT.lib(_file.obj) definiert.
2>  Kernel.cu
2>LIBCMT.lib(crt0init.obj) : warning LNK4098: Standardbibliothek "msvcrt.lib" steht in Konflikt mit anderen Bibliotheken; /NODEFAULTLIB:Bibliothek verwenden.
2>  LINK : /LTCG wurde angegeben, es ist jedoch keine Codegenerierung erforderlich. Entfernen Sie /LTCG aus der Linkbefehlszeile, um die Linkerleistung zu erhöhen.
2>msvcrt.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) ist bereits in LIBCMT.lib(typinfo.obj) definiert.
2>msvcrt.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) ist bereits in LIBCMT.lib(typinfo.obj) definiert.
2>msvcrt.lib(MSVCR110.dll) : error LNK2005: _exit ist bereits in LIBCMT.lib(crt0dat.obj) definiert.

Auch hier wieder meine Frage:
Wie muss ich mein Projekt einstellen und Kompilieren um es auch auf anderen "frischen" Computern zum laufen zu bekommen? [ist mir klar, dass der "frische" Computer wenigstens Windows und NVidia Treiber braucht...]


Priorität hätte mein zweites Problem, ich habe jedoch den Verdacht dass durch die Lösung des ersten auch das zweite gelöst wird ;P

Lösungsansätze wie "/NODEFAULTLIB:Bibliothek" habe ich bereits erfolglos versucht.
Auch der Wechsel zwischen Unicode und Multibyte Zeichensatz erbrachte keine Lösung.

Außerdem habe ich noch immer keine Antwort von den Administratoren erhalten...
Ich habe mein Geburtstag bei der Registrierung aus versehen falsch eingetragen, sollte das also ein Administrator lesen so möge er mir bitte Antworten.

Und der Grund warum ich so "übergenau" mit meine Fragen bin ist, weil ich bereits einen Account hier hatte, jedoch das Passwort vergaß und mittlerweile eine Neue Mailadresse habe.
"Was ist deine Frage?" nervt mich so langsam...
Jedoch bin ich Dankbar für Hilfe (die ich hier eigentlich immer bekam zwischen all dem anderen...)

Bei Bedarf lade ich auch noch eine Projektmappe hoch, in der ich die einzelnen Konstelationen mit und ohne SDL2/CUDA darstelle...

Solltet ihr Fragen haben, schaue ich jeden Abend hier vorbei.

Vielen Dank, Euer Neko
 
Zu Allererst:
Ich arbeite in Windows 7 mit "Microsoft Visual Studio Express 2013 c++ für Windows Desktop"
Außerdem habe ich auch die 2012 Version installiert [aufgrund von CUDA]
Ich weiss nicht, ob das nötig ist. Ich habe auch 2012 und 2013 installiert, jedoch kann man ja in den Projekteinstellungen auch in der 13er-Version den Compiler wechseln. Funktioniert bei mir einwandfrei:
Projekteinstellungen->Konfigurationseigenschaften->Allgemein->Plattformtoolset.
1. Kann ich pure SDL2 Projekte nicht mit der /MT einstellung Kompilieren
Nun, du linkst wohl gegen die SDL2-libs, oder? Und die wurden wohl mit /MD (dynamic linking) erstellt, wodurch die msvcrt.lib in den libs gegen die libcmt.lib (/MT) konkurriert. Zwei Möglichkeiten: Entweder du kompilierst die SDL2-libs mit /MT neu oder du machst dein Projekt mit /MD, und damit kommen wir zu:
Mit der Einstellung /MD funktionieren meine SDL2 Applikationen einwandfrei, jedoch nur auf Computern auf denen auch MSVS installiert ist.

Ich habe bereits erfolglos im Internet nach einer Lösung gesucht.
und für die "Was ist deine Frage?" Menschen unter uns:
Wie muss ich SDL Kompilieren um es auch auf anderen Computern zum laufen zu bekommen?
Jain. Du brauchst nicht Visual Studio selbst, sondern die Runtime Library bzw. das Redistributable Package: http://www.microsoft.com/de-ch/download/details.aspx?id=30679
Und zwar die Version, mit der auch das Programm kompiliert wurde (inklusive "Bittigkeit"). Für dich heisst das: Wähle den x86-Installer, auch wenn du ein x64-System hast.

Weiteres zu den Compilerflags:
http://msdn.microsoft.com/en-us/library/2kzt1wy3.aspx

und mein Zweites Problem wäre folgendes:
Auch CUDA Anwendungen kann ich problemlos Kompilieren und ausführen, sobald ich jedoch die SDL.h sowie deren Bibliotheken einbinde (SDL2.lib & SDL2main.lib) gibt der Compiler Fehlermeldungen aus und weigert sich mir ein Programm aus zu spucken.
Deine Vermutung stimmt. Wieder wurde etwas mit /MD und das andere mit /MT kompiliert.
Wie muss ich mein Projekt einstellen und Kompilieren um es auch auf anderen "frischen" Computern zum laufen zu bekommen? [ist mir klar, dass der "frische" Computer wenigstens Windows und NVidia Treiber braucht...]
Ebenfalls einheitliche Compilerflags und vcredistx86.exe.

Gruss
cwriter

/EDIT: Noch was:
Bei dem 2. Fehlermeldungsabschnitt kompilierst du einmal mit MSVCR120.dll (VS2013), beim 2. mit MSVCR110.dll (VS2012). Statische libs mögen das nicht sonderlich. Vielleicht funktioniert es aber dennoch. Behalte das einfach im Hinterkopf.
 
jedoch kann man ja in den Projekteinstellungen auch in der 13er-Version den Compiler wechseln
exakt das mache ich ja ^^
Hatte das 2012 schon installiert da gab es das 2013 noch gar nicht und wollte das jetzt hier nur als Zusatzinformation mitgeben, dass ich den habe (fals das wichtig gewesen sein sollte)

Könntest du mir
du kompilierst die SDL2-libs mit /MT neu
dabei helfen?

denn aus
Deine Vermutung stimmt. Wieder wurde etwas mit /MD und das andere mit /MT kompiliert.
Entnehme ich, dass wenn ich die SDL2 mit /MT Kompiliere sich das zweite Problem von selbst löst. Richtig?

Ich möchte dir hier nochmal (zusätzlich zum Danke Knopf) danken, du hast es wirklich verständlich erklärt und ich hoffe dass du mir auch weiter helfen kannst.

Obwohl ich schon etwas länger mit C++ arbeite und so einiges kann, muss ich doch zugeben dass es vieles gibt was ich noch nicht weiß.
[hab mir bisher alles selber aus dem Internet beigebracht...]
Kompiliert hab ich bisher nur in exe files und eine .Lib datei (aber nur des Tutorials wegen und hab diese Methode auch nie erneut versucht... hatte auch bein selbst experimentieren Probleme mit klassen... versteh es bis heute nicht ganz... naja... ich schweife ab), habe also gar keine Erfahrung mit der Kompilierung von .lib Dateien q_q

Auf jeden Fall Danke, und ich hoffe auf Hilfe mit dem neu Kompilieren von SDL2 mit /MT

Grüße Neko
 
Hatte das 2012 schon installiert da gab es das 2013 noch gar nicht und wollte das jetzt hier nur als Zusatzinformation mitgeben, dass ich den habe (fals das wichtig gewesen sein sollte)
Ach so. Dann wäre das auch geklärt. Ich hatte schon Sorgen, du würdest mit 2 IDEs gleichzeitig arbeiten :p

Könntest du mir dabei helfen?
Puh, ich gebe zu, solche Konflikte immer gemieden zu haben.
Aber eigentlich sollte das hier gehen (auch wenn es schon etwas älter ist):
http://forums.libsdl.org/viewtopic.php?t=9634&sid=917224a793e6a71f05b1c7ed49120797
Sollte dem nicht so sein, melde dich wieder.

denn aus [..] entnehme ich, dass wenn ich die SDL2 mit /MT Kompiliere sich das zweite Problem von selbst löst. Richtig?
Sollte es, ja. Garantieren kann ich noch für nix.

Obwohl ich schon etwas länger mit C++ arbeite und so einiges kann, muss ich doch zugeben dass es vieles gibt was ich noch nicht weiß.
[hab mir bisher alles selber aus dem Internet beigebracht...]
Willkommen im Club :p

Kompiliert hab ich bisher nur in exe files und eine .Lib datei (aber nur des Tutorials wegen und hab diese Methode auch nie erneut versucht... hatte auch bein selbst experimentieren Probleme mit klassen... versteh es bis heute nicht ganz... naja... ich schweife ab), habe also gar keine Erfahrung mit der Kompilierung von .lib Dateien q_q
Auch wenn du offenbar schlechte Erfahrungen gemacht hast, kannst du auch Fragen zu Klassen im Forum stellen, falls etwas unklar ist.

Auf jeden Fall Danke, und ich hoffe auf Hilfe mit dem neu Kompilieren von SDL2 mit /MT
Bitte gerngeschehen :)
Hilfe kann ich vorerst bis auf den Link nicht weiter anbieten, der allerdings schon ziemlich exakt sein dürfte. Ansonsten einfach nachfragen :)

Gruss
cwriter
 
Yay ^^
Sozial bin und meine Schritte zur Lösung teile:
Hab mir einfach SDL 2 geladen (nicht das developer pack, sondern SDL2 direkt)
Da dann unter VisualC die Projektmappe geöffnet, beim SDL2 und SDL2main Projekt die Eigentschaft von /MD auf /MT geändert und das ganze dann Erstellt.
Die dabei entstandenen lib und dll dateien einfach genommen und in das Projekt eingebunden :3

Funktioniert alles, wie im Traum :3
Schon die ersten Versuche erfolgreich ^^
SDL2 tut was es soll, die CUDA kerne tun was sie sollen, alle sind glücklich :3

Grüße, Neko
 

Neue Beiträge

Zurück