sdl projekt startet nicht auf fremden pcs
-
xBlackKnightx schrieb:
heisst das je nach dem ob "stdafx.h" includiert ist oder nicht. oder was meinst du mit "oben" ? wenn ich auf verwenden klicke, kommt
ja
xBlackKnightx schrieb:
mein projekt hat keine stdafx.h includes. sowas kommt man wenn man beim projekt erstellen nicht auf leeres projekt aktiviert oder?
wofür sind sie überhaupt? müssen sie includiert werden?1. ja, denk ich schon?
2. Sagen wir du hasst 40 .cpp Dateien und in allen includierst du myInclude.h.
Jetzt kompilierst du alle 40 .cpp Dateien in einem project und jedesmal wenn
ein #include "myInclude.h" vorkommt, muss der Compiler es parsen, also 40 mal die gleiche Datei myInclude.h. Wenn Vorkompilierte Header eingeschaltet
ist wird diese Datei myInclude.h einmal geparst und binär gespeicher.
Wenn jetzt der Compiler auf ein #include "myInclude.h" trifft lädt er die binäre Header Datei, list alle Symbolische informationen raus ohne Zeit zu verschwenden für das Parsen.
--> schnellere Kompilierung.Nein
-
okay ich habe jetzt noch mal von vorne gemacht:
neues projekt: win32 mit stdafx.h
alles Schritte von dir gemacht
so langsam wird es interessant -
der einzige Konflikt entsteht immer dann:sobald ich
#include "SDL/SDL.h"inkludiere. nur allein das. der main bleibt leer, dann entsteht compilerfehler.
immer nur dann, wenn Laufzeitbibliothek auf MT geschaltet ist.auf MD ist es dann kein Problem.
Wenn ich es aufm anderen PC ausführe, kommt Konfigurationsfehler.
wenn ich SDL include wieder rausnehme, dann geht MT wunderbar
somit läuft es auf dem PC auch. Allerdings ohne SDL
ich denke wir kommen da etwas näher
nun wie geht es weiter?Der Fehler sah immer so aus:
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.
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.
msvcrt.lib(MSVCR80.dll) : error LNK2005: _isspace ist bereits in LIBCMT.lib(_ctype.obj) definiert.
msvcrt.lib(MSVCR80.dll) : error LNK2005: ___iob_func ist bereits in LIBCMT.lib(_file.obj) definiert.
msvcrt.lib(MSVCR80.dll) : error LNK2005: _fclose ist bereits in LIBCMT.lib(fclose.obj) definiert.
msvcrt.lib(MSVCR80.dll) : error LNK2005: _exit ist bereits in LIBCMT.lib(crt0dat.obj) definiert.
LIBCMT.lib(crt0init.obj) : warning LNK4098: Standardbibliothek "msvcrt.lib" steht in Konflikt mit anderen Bibliotheken; /NODEFAULTLIB:Bibliothek verwenden.
L:\CPP\Programmierung\ExistenzForschung\ExistenzForschung\Release\ExistenzForschung.exe : fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden.natürlich habe ich auch einmal libc.lib in Bibliothek ignorieren versucht
-
Habe was gefunden.
http://www.libsdl.org/faq.php?action=listentries&category=4
-
wenn du das meinst
Q: When using Visual C++ I get link errors relating to MSVCRT.LIB or LIBC
A: SDL is dynamically linked with the multi-threaded version of the Microsoft Visual C runtime. You need to edit your project settings, go to the C++ language tab, change the listbox to "Code Generation" settings, and then change the runtime library to "Multi-threaded DLL". Make sure you do this with all projects that you link into your application.ja das hört sich so an dass man gar nicht auf MT stellen kann? folglich kann ich sie nicht auf anderen PCs ausführen

-
Ich glaube jetz die richtige Lösung gefunden zu haben.
Das ganze Problem kommt durch dieses Manifest, man muss es ausschalten.
Also Projekteigenschafte:
Manifesttool -> Engabe und Ausgabe -> Manifest einbetten: Nein
Manifesttool -> Allgemein -> Ausfürliche Ausgabe: Ja
// für bessere Fehlermeldungen zu Laufzeit ( Message Box )
-
wieder nix
ich hab mal das projekt hochgeladen. vielleicht funktioniert es nur bei euch?
www.x-y-a.com/uploads/SDL_Problem.rarnatürlich muss sdl.dll in system32 vorhanden sein und die ganzen libs in VC
kriegt ihr das so kompiliert dass es auch auf anderen rechnern läuft?
-
Die Lösung:
#include <SDL.h> #ifdef _WIN32 #undef main #endif int main( int argc, char* args[] ) { SDL_Init( SDL_INIT_EVERYTHING ); SDL_Quit(); return 0; }Dieser Code läuft ohne probleme.
Alle optionen können verwendet werden.
/MT
/MTd
/MD
/MDd
die DLL versionen funktioniren auf fremden
Rechnern nur, wenn man eine manifest erstellt und configuriert.Am besten ein neues projekt "leeres Project" erstellen,
SDL.lib SDLmain.lib nicht vergessen.Linker -> System -> Sybsystem: Konsole
Linker -> System -> Zielcomputer: x86kompiliren.

So einfach

#undef main <-- bad bad bad

PS:
// manifest ausserhalb der exe
Manifesttool -> Eingabe und Ausgabe -> Manifest einbeten: Nein// manifest in die exe integrieren
Manifesttool -> Eingabe und Ausgabe -> Manifest einbeten: Ja
-
whow
jetzt funktioniert es
kennst dich wohl mit VC gut aus?
das war hart, z.b. darf die exe datei nicht im selben verzeichnis sein, wo manifest-datei ist. (die war bei mir immer vorhanden, obwohl ich sie gar nicht mehr generierte) erst nach dem ich sie gelöscht habe, gings es auf einmal. das hat mich so verwirrt, weil es hätte ja eigentlich funktionieren sollen! das war das heimtückische.
man müsste alles aufschreiben worauf man achten soll
ich muss wohl noch einiges rumstellen - später noch, müde erst mal
Ramsis schrieb:
So einfach

#undef main <-- bad bad bad

ja diese faces interpretieren mich jetzt

-
xBlackKnightx schrieb:
kennst dich wohl mit VC gut aus?
eigentlich schon, und wenn nicht dann giebts google
-
Eine bessere Lösung.
Die Anwendung muss eine win32-Anwendung sein und keine Win32-Konsolenanwendung.
Kompiliert ohne probleme.#include <windows.h> #include <SDL.h> int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { SDL_Init( SDL_INIT_EVERYTHING ); SDL_Quit(); return 0; }