SDL Projekt in VC++ Compilieren (non Mutithreaded DLL)



  • Hallo!

    Ich möchte mein SDL-Projekt, so kompilieren, dass ich nicht die VC-DLLs mitgeben muss, damit dass Programm/Spiel auf einem System ohne VC läuft. Dazu muss ich die Option Mutithreaded gesetzt haben. Nur wenn ich dass Projekt dann erzeugen will bekomme ich Linkerfehler, die auf der Homepage dieser Option zu geschrieben werden.
    http://www.libsdl.org/faq.php?action=listentries&category=4#43

    Kann ich irgendwie die doppelt vorhandenen Funktionen auskommentieren oder dem Linker mitteilen, dass er dass ignorieren soll.

    Hier der Log:

    ------ Erstellen gestartet: Projekt: spiel, Konfiguration: Release Win32 ------
    Kompilieren...
    main.cpp
    .\main.cpp(219) : warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    C:\Programme\Microsoft Visual Studio 9.0\VC\include\stdio.h(237): Siehe Deklaration von 'fopen'
    Verknüpfen...
    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(MSVCR90.dll) : error LNK2005: _exit ist bereits in LIBCMT.lib(crt0dat.obj) definiert.
    msvcrt.lib(MSVCR90.dll) : error LNK2005: ___iob_func ist bereits in LIBCMT.lib(_file.obj) definiert.
    msvcrt.lib(MSVCR90.dll) : error LNK2005: _fgetc ist bereits in LIBCMT.lib(fgetc.obj) definiert.
    msvcrt.lib(MSVCR90.dll) : error LNK2005: _fopen ist bereits in LIBCMT.lib(fopen.obj) definiert.
    msvcrt.lib(MSVCR90.dll) : error LNK2005: _fclose ist bereits in LIBCMT.lib(fclose.obj) definiert.
    msvcrt.lib(MSVCR90.dll) : error LNK2005: _isspace ist bereits in LIBCMT.lib(_ctype.obj) definiert.
    LIBCMT.lib(crt0init.obj) : warning LNK4098: Standardbibliothek "msvcrt.lib" steht in Konflikt mit anderen Bibliotheken; /NODEFAULTLIB:Bibliothek verwenden.
    D:\Windows Daten\Visual Studio 2008\Projects\spiel\Release\spiel.exe : fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden.
    Das Buildprotokoll wurde unter "file://d:\Windows Daten\Visual Studio 2008\Projects\spiel\spiel\Release\BuildLog.htm" gespeichert.
    spiel - 9 Fehler, 2 Warnung(en)
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========

    Linkeroption /NODEFAULTLIB:msvcrt.lib hilft auch nicht weiter...

    Verknüpfen...
    sdlmain.lib(SDL_win32_main.obj) : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__strrchr".
    sdlmain.lib(SDL_win32_main.obj) : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__fprintf".
    sdlmain.lib(SDL_win32_main.obj) : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__remove".
    sdlmain.lib(SDL_win32_main.obj) : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__setbuf".
    sdlmain.lib(SDL_win32_main.obj) : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__setvbuf".
    sdlmain.lib(SDL_win32_main.obj) : error LNK2001: Nicht aufgelöstes externes Symbol "__imp__freopen".
    D:\Windows Daten\Visual Studio 2008\Projects\spiel\Release\spiel.exe : fatal error LNK1120: 6 nicht aufgelöste externe Verweise.

    Ich habe die Linkfehler schon durch entfernen der ein oder anderen "includes" reduzieren können, aber letztendlich kann ich ja auch nicht auf alle verzeichten!

    Hier der Includebereich meines Quellcodes (falls wichtig):

    #include "sdl.h" 
    #include "sdl_image.h" 
    #include <ctime> 
    #include <windows.h>
    

    Wäre echt schön, wenn irgend jemand Rat wüste!

    Falls gar nicht möglich, würde ich mich vielleicht auch mit einer Auflistung der Dateien zufrieden, die ich benötige, um mein Projekt als Multithreaded weiterzugeben.

    Ich benutze Visual Studio 2008



  • Einfach die LIBCMT.lib ignorieren.
    Projekteinstellungen -> Konfiguration -> Linker -> Input -> Ignore Specific Library -> Da eintragen

    Sollte reichen.



  • Nö. Glaube ich nicht.

    Auf der SDL-FAQ Seite steht doch:

    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.

    Also sollte das eigene Programm auch die "Multi-threaded DLL" Runtime verwenden. Alles andere führt
    nur zu Problemen.

    (Ich weiss nicht, ob es die Option gibt, die SDL selbst als DLL mit "Multi-threaded Static" Runtime zu übersetzen)



  • mad_martin schrieb:

    Einfach die LIBCMT.lib ignorieren.
    Projekteinstellungen -> Konfiguration -> Linker -> Input -> Ignore Specific Library -> Da eintragen

    Sollte reichen.

    Dann passiert das:

    ------ Erstellen gestartet: Projekt: spiel, Konfiguration: Release Win32 ------
    Kompilieren...
    main.cpp
    .\main.cpp(221) : warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    C:\Programme\Microsoft Visual Studio 9.0\VC\include\stdio.h(237): Siehe Deklaration von 'fopen'
    .\main.cpp(266) : warning C4101: 'tempSur': Unreferenzierte lokale Variable
    .\main.cpp(354) : warning C4101: 'key': Unreferenzierte lokale Variable
    .\main.cpp(355) : warning C4101: 'c': Unreferenzierte lokale Variable
    Verknüpfen...
    main.obj : error LNK2001: Nicht aufgelöstes externes Symbol "@__security_check_cookie@4".
    main.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__itoa_s".
    main.obj : error LNK2001: Nicht aufgelöstes externes Symbol "_fgetc".
    main.obj : error LNK2001: Nicht aufgelöstes externes Symbol "_atexit".
    main.obj : error LNK2001: Nicht aufgelöstes externes Symbol "_fopen".
    main.obj : error LNK2001: Nicht aufgelöstes externes Symbol "_rand".
    main.obj : error LNK2001: Nicht aufgelöstes externes Symbol "_srand".
    main.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""void __cdecl operator delete(void *)" (??3@YAXPAX@Z)".
    main.obj : error LNK2001: Nicht aufgelöstes externes Symbol "_fclose".
    main.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__time64".
    main.obj : error LNK2001: Nicht aufgelöstes externes Symbol "_exit".
    main.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z)".
    LINK : error LNK2001: Nicht aufgelöstes externes Symbol "_mainCRTStartup".
    D:\Windows Daten\Visual Studio 2008\Projects\spiel\Release\spiel.exe : fatal error LNK1120: 13 nicht aufgelöste externe Verweise.
    Das Buildprotokoll wurde unter "file://d:\Windows Daten\Visual Studio 2008\Projects\spiel\spiel\Release\BuildLog.htm" gespeichert.
    spiel - 14 Fehler, 4 Warnung(en)
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========



  • Pingu schrieb:

    mad_martin schrieb:

    Einfach die LIBCMT.lib ignorieren.
    Projekteinstellungen -> Konfiguration -> Linker -> Input -> Ignore Specific Library -> Da eintragen

    Sollte reichen.

    Dann passiert das:

    ------ Erstellen gestartet: Projekt: spiel, Konfiguration: Release Win32 ------
    Kompilieren...
    main.cpp
    .\main.cpp(221) : warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    C:\Programme\Microsoft Visual Studio 9.0\VC\include\stdio.h(237): Siehe Deklaration von 'fopen'
    .\main.cpp(266) : warning C4101: 'tempSur': Unreferenzierte lokale Variable
    .\main.cpp(354) : warning C4101: 'key': Unreferenzierte lokale Variable
    .\main.cpp(355) : warning C4101: 'c': Unreferenzierte lokale Variable
    Verknüpfen...
    main.obj : error LNK2001: Nicht aufgelöstes externes Symbol "@__security_check_cookie@4".
    main.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__itoa_s".
    main.obj : error LNK2001: Nicht aufgelöstes externes Symbol "_fgetc".
    main.obj : error LNK2001: Nicht aufgelöstes externes Symbol "_atexit".
    main.obj : error LNK2001: Nicht aufgelöstes externes Symbol "_fopen".
    main.obj : error LNK2001: Nicht aufgelöstes externes Symbol "_rand".
    main.obj : error LNK2001: Nicht aufgelöstes externes Symbol "_srand".
    main.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""void __cdecl operator delete(void *)" (??3@YAXPAX@Z)".
    main.obj : error LNK2001: Nicht aufgelöstes externes Symbol "_fclose".
    main.obj : error LNK2001: Nicht aufgelöstes externes Symbol "__time64".
    main.obj : error LNK2001: Nicht aufgelöstes externes Symbol "_exit".
    main.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z)".
    LINK : error LNK2001: Nicht aufgelöstes externes Symbol "_mainCRTStartup".
    D:\Windows Daten\Visual Studio 2008\Projects\spiel\Release\spiel.exe : fatal error LNK1120: 13 nicht aufgelöste externe Verweise.
    Das Buildprotokoll wurde unter "file://d:\Windows Daten\Visual Studio 2008\Projects\spiel\spiel\Release\BuildLog.htm" gespeichert.
    spiel - 14 Fehler, 4 Warnung(en)
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========

    Wenn du dir das durchliest, dann dürfte es nicht mehr viel mit SDL zu tun haben.

    Mach mal /NODEFAULTLIB als Statement wieder rein. Oder raus.



  • Das eigene Programm mit einer anderen Runtime linken als verwendete DLLs ist meist doof, das schreit nach Problemen.

    Gib einfach die Runtime DLLs mit, ist die einfachste Lösung.

    dass ich nicht die VC-DLLs mitgeben muss, damit dass Programm/Spiel auf einem System ohne VC läuft

    Wieso sollte das Spiel nicht auf einem System ohne VC laufen? Die VC Runtime muss installiert sein, ja, aber doch nicht der VC selbst. Oder du kopierst die nötigen DLLs (meist 2 Stück) einfach ins gleiche Verzeichnis wie deine .exe, dann geht das auch ohne dass man was installieren müsste.



  • Habe auch schon VS Runtime installiert, geht aber trotzdem nicht!



  • Die Linker-Fehler weisen daraufhin, dass du Funktionen verwendest die zwar deklariert, aber nicht definiert sind, das passiert zum Beispiel wenn die lib nicht drinnen ist(die DLL wird erst beim Programmstart benoetigt und dem Compiler und Linkler ist dessen Existenz egal), was wahrscheinlich bei dir das Problem sein sollte. Fueg beim Linker daher nochmal zusaetzlich die SDL libs ein(irgendwo bei den Projekteinstellungen unter general->Linker oder so).



  • tarrox, guck doch mal genau. Er hat kein Problem mit der SDL sondern mit der Runtime Library.


Anmelden zum Antworten