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

1

03.02.2010, 18:05

Wieder ein Linkerfehler...

Hallo zusammen,

und der nächste, der sich mit einem Linkerfehler meldet...

Ich wollte mir eine kleine Include-Datei schreiben, die das Schreiben ins Debug-Fenster von VC++08 einfacher macht.

OutputDebug.h:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef __OUTPUTDEBUG
#define __OUTPUTDEBUG

#include <sstream>
#include <windows.h>

//Mit dem Makro kann man Strings und Zahlen direkt wie in std::ostringstream verknüpfen

#define OutputDebugStringEx(X) {\
    {   std::ostringstream OutputDebugStringExObject; \
        OutputDebugStringExObject << X; \
        OutputDebugString(OutputDebugStringExObject.str().c_str()); \
    } \
    }

//void OutputDebugVector ();


#endif


Soweit in Ordnung. Wenn ich jetzt aber versuche, neben einem Makro auch eine "richtige" Funktion zu deklarieren, gibt es ein Problem.

Ich nehme die oben auskommentierte vorletzte Zeile wieder dazu und schreibe ein kleine Datei OutputDebug.cc:

C-/C++-Quelltext

1
2
3
4
5
#include <OutputDebug.h>

void OutputDebugVector ()
{
}

Soweit kompiliert und linkt er es noch ohne Probleme.

Wenn ich jetzt aber in einem Projekt OutputDebug.h include und dann OutputDebugVector(); aufrufen möchte, bekomme ich den Linkerfehler LNK2001:

C-/C++-Quelltext

1
1>Snake.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""void __cdecl OutputDebugVector(void)" (?OutputDebugVector@@YAXXZ)".


Haben mich sämtliche Programmierfähigkeiten verlassen, oder liegt das an irgendeinem Spezialfall, oder was ist da los? Tut mir Leid, aber ich weiß im Moment echt nicht, woran das liegt...

Viele Dank für eure Hilfe!
PPretzel

2

03.02.2010, 20:34

Wieso benutzt ein Makro? Das ist doch eine schöne Einsatzmöglichkeit für ein Template:

C-/C++-Quelltext

1
2
3
4
5
6
7
template <class T>
const char* OutputDebugStringEx (const T& in)
{
    std::ostringstream OutputDebugStringExObject;
    OutputDebugStringExObject << in;
    OutputDebugString(OutputDebugStringExObject.str().c_str());
}

3

04.02.2010, 17:33

An Templates hatte ich gar nicht gedacht... Werde aber trotzdem beim Makro bleiben, denn damit kann ich mehrere Strings, ints, floats etc einfach verknüpfen (à la OutputDebugStringEx("Wert von int a: " << a << " und von float b: " << b << "\n"), während ich in Deiner Lösung, wenn ich sie richtig verstehe, immer nur eine Variable ausgeben kann. Oder hätte ein Template hier noch andere Vorteile?

Leider löst das aber nicht das Problem, das ich oben geschildert habe... Hätte jemand dazu eine Idee?

Vielen Dank! PPretzel

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

04.02.2010, 18:00

Hat es eigentlich einen bestimmten Grund das du OutputDebug in "<>" inkludierst?

5

04.02.2010, 18:25

Ich habe OutputDebug.h /.cc in einem Verzeichnis "Eigene Includes", um die Dateien später einfach ohne Kopieren wieder includen zu können. Das Verzeichnis habe ich zu den Standard-Include-Verzeichnissen hinzugefügt und dachte deshalb, dass <> in diesem Fall richtig ist?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

04.02.2010, 19:19

In dem Fall, ist OutputDebug.cc in deinem Projekt vertreten?

7

04.02.2010, 20:23

Ich glaube, ich erkenne gerade die Ursache des Problems :oops:

Nein, ich habe OutputDebug.cc nicht (wissentlich) hinzugefügt.

Ich dachte, das sei nicht notwendig, da andere Header-Files ja auch nur auf diese Weise eingebunden werden, und das von mir angewandte Schema wurde in C++ für Spieleprogrammierer besprochen. Scheint aber noch ein paar Ergänzungen zu haben?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

8

04.02.2010, 22:15

Mit der Deklaration allein kommst du nich besonders weit und irgendwoher muss der Compiler die Implementierung ja kennen. Da gibts diverse Möglichkeiten, z.B. per Dll oder .lib. Oder du stellst eben den Quellcode zur Verfügung, in dem Fall musst du die entsprechenden Dateien in dein Projekt einfügen.

Werbeanzeige