Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

TigerClaw25

unregistriert

1

07.04.2013, 11:31

SDL_ttf Fehlermeldung

Hallo,
ich habe ein Problem mit der SDL_ttf.

Hab die zip entpackt und kompiliert. Dann die SDL_ttf.h in mein include Verzeichnis kopiert und zur Sicherheit auch die DLL ins richtige Verzeichnis.

Dann folgendes in meine Framework::Init() eingefügt:

C-/C++-Quelltext

1
2
3
4
5
6
// Schrift für Lebensanzeige etc. initialisieren
    if(TTF_Init() == -1)
    {
    cout << "Konnte SDL_ttf nicht initialisieren! Fehler: " << TTF_GetError() << endl;
    return (false);
    }


Aber es kompiliert nicht. SDL_ttf.h habe ich per include eingebunden

1>MSVCRTD.lib(cinitexe.obj) : warning LNK4098: Standardbibliothek "msvcrt.lib" steht in Konflikt mit anderen Bibliotheken; /NODEFAULTLIB:Bibliothek verwenden.
1>Framework.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_TTF_Init" in Funktion ""public: bool __thiscall CFramework::Init(int,int,int,bool)" (?Init@CFramework@@QAE_NHHH_N@Z)".
1>C:\Projekte\SDL_Game\Debug\SDL_Game.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.
1>Das Buildprotokoll wurde unter "file://c:\Projekte\SDL_Game\SDL_Game\Debug\BuildLog.htm" gespeichert.
1>SDL_Game - 2 Fehler, 1 Warnung(en)

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

2

07.04.2013, 11:33

Da fehlt 'ne .lib. ;)
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

TigerClaw25

unregistriert

3

07.04.2013, 11:37

ich Verzeichnis war nur eine lib, die habe ich auch bei Einstellungen für den Linker angegeben.

Dachte es liegt vielleicht an der Parameterliste der Funktion von framework

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
bool CFramework::Init (int ScreenWidth, int ScreenHeight,
                       int ColorDepth, bool bFullscreen)
{
    // Alle Systeme der SDL initialisieren (Teilbereiche: Audio, Grafik, Timer, Joystick etc..)
    if (SDL_Init (SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_AUDIO) == -1 )
    {
        cout << "SDL konnte nicht initialisiert werden!" << endl;
        cout << "Fehlermeldung: " << SDL_GetError () << endl;

        Quit ();

        return (false);
    }

    // Schrift für Lebensanzeige etc. initialisieren
    if(TTF_Init() == -1)
    {
    cout << "Konnte SDL_ttf nicht initialisieren! Fehler: " << TTF_GetError() << endl;
    return (false);
    }

    // Vollbild oder Fenstermodus einstellen
    if (bFullscreen == true)
    {
        m_pScreen = SDL_SetVideoMode (ScreenWidth, ScreenHeight, ColorDepth,
            SDL_HWSURFACE | SDL_DOUBLEBUF |
            SDL_FULLSCREEN);
    }
    else
    {
        m_pScreen = SDL_SetVideoMode (ScreenWidth, ScreenHeight, ColorDepth,
            SDL_HWSURFACE | SDL_DOUBLEBUF);
    }

    // Prüfen, ob alles funktioniert hat
    if (m_pScreen == NULL)
    {
        cout << "Videomodus konnte nicht gesetzt werden!" << endl;
        cout << "Fehlermeldung: " << SDL_GetError () << endl;

        Quit ();

        return (false);
    }

    // Zeiger auf internes Array für Tastaturstatus ermitteln
    m_pKeystate = SDL_GetKeyState (NULL);

    // Alles ging glatt, also true zurückliefern
    return (true);

} // Init



Edit: Die SDL_ttf.lib aus dem Debug Verzeichnis hat gefehlt, dachte alle Libs sind im Ordner des SDL_ttf Ordners

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

4

07.04.2013, 11:41

Sobald du den Fehler

Zitat

Verweis auf nicht aufgelöstes externes Symbol
oder generell irgendwas mit error LNKxxxx bekommst, dann fehlt immer eine .lib.
Kann man sich gut merken. ;)
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

TigerClaw25

unregistriert

5

07.04.2013, 11:43

Danke für den Tipp. Kapiere gerade nicht, warum dll und lib und include alles so hin und her geschoeben werden muss, also in unterschiedliche Verzeichnisse, aber vllt kommt das mit der Erfahrung ...

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

07.04.2013, 12:09

Header sind zum Kompilieren da.
Libs zum Linken.
DLLs zur Ausführung.

Also wohl ganz offensichtlich, warum man alles davon braucht und warum das in unterschiedliche Verzeichnisse gehört.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

TigerClaw25

unregistriert

7

07.04.2013, 15:28

Ach so, ok danke.

Hab das jetzt eingebunden, funktioniert auch, aber verstehe den Grund dann dopch nicht.

Habe den Initialisierungsteil in die Framework::Init()-Funktion kopiert. Dann habe ich in der game.cpp Datei den restlichen Code zum Laden des Textes in die FUnktion Game::Init() kopiert.


In CGame::Run() habe ich dann folgende Teil kopiert:

SDL_Rect textPosition;
textPosition.x = 10;
textPosition.y = 5;
SDL_BlitSurface(text, 0, m_pScreen, &textPosition);

Da in der Game-Klasse kein m_pScreen existiert, habe noch folgende Zeile hinzugefügt: m_pScreen = g_pFramework->GetScreen ();

Den Zeiger auf m_pScreen habe ich dabei in der Game-Header deklariert.

Verstehe nur nicht, warum es funktioniert. Ich habe eine weiteren Zeiger SDL Surface *m_pScreen in meiner Sprite.hpp und jetzt nopch eine in Game.hpp. Handelt es sich um unterschiedliche Zeiger oder wie? Blick da momenta nicht durch ... WENN ich das richtig verstehe, habe ich mir eine neuen Zeiger in der game.hpp erzeugt und dieser zeigt nach dieser Zeile: m_pScreen = g_pFramework->GetScreen (); auf das screen der framework ... ???

MGBeginner

Frischling

Beiträge: 81

Wohnort: Limburg

  • Private Nachricht senden

8

07.04.2013, 18:40

Ja klar sind das unterschiedliche Zeiger. Diese zeigen nach der Zuweisung eben beide auf das selbe Screen-Surface. Du könntest es aber auch so machen :

SDL_BlitSurface(text, 0, g_pFramework->GetScreen (), &textPosition);

Was macht eigentlich deine if-Abfrage ?

TigerClaw25

unregistriert

9

07.04.2013, 19:38

Welche if-Abfrage?

MGBeginner

Frischling

Beiträge: 81

Wohnort: Limburg

  • Private Nachricht senden

10

07.04.2013, 19:42

sorry, die if-Abfrage bezog sich auf ein anderes Thema, habe deinen Namen gerade verwechselt :rolleyes:

Werbeanzeige