error LNK2019: Verweis auf nicht aufgelöstes externes Symbol

soul710

Erfahrenes Mitglied
Hallo,

habe hier irgendwie ein blödes Problem. Ich bekomme o.g. Fehler, d.h. ein nicht aufgelöstes externes Symbol. Der Aufbau meines Projektes ist wie folgt:

- viele .h Dateien (meine Klassen)
- viele .cpp Dateien (meine Klassen)
- eine main.cpp (offensichtlich)

- eine .h Datei einer externen Library (geklaut), dort sind ein paar C-Funktionen deklariert (keine Klassen)
- eine dazu passende .c Datei, in der die o.g. Funktionen implementiert sind, sowie weitere statische Funktionen (die nicht in der .h Datei definiert sind)

Aus dieser .h Datei bzw .c Datei möchte ich nun 1 nicht statische Funktion in einer meiner Klassen in der .cpp Datei nutzen.
Alle Dateien sind in meinem Visual Studio (2008) Projekt, und werden alle korrekt kompiliert. Im Objekt-Verzeichnis finde ich die passende Objekt Datei zu meiner C-Datei. Der Header wird auch korrekt gefunden und eingebunden, allerdings bekomme ich den Fehler nicht weg, er will mir einfach nicht linken.

Hat jemand eine Idee woran das liegen könnte?

Falls das was hilft: Das Programm ist eine Qt-Anwendung, Visual Studio Projekt wurde mit qmake erzeugt. Alle Source und Header Files sind im .pro File eingetragen.

Wenn ich versuche, eine der in der .c Datei statisch implementierten Funktionen zu nutzen, meint er:

error C2129: Statische Funktion "void foo(unsigned char *,int)" wurde deklariert, aber nicht definiert

obwohl die Funktion in der .h sowie in der .c Datei steht.

Was mach ich denn falsch? :(
 
Hi.

Ein C++ Compiler erwartet ein anderes Symbol (Name einer Funktion) in einer Objektdatei als ein C Compiler. D.h. bei einer Funktion mit dem Prototyp "int foo(int a)" erwartet ein C++ Compiler z.B. das Symbol "__Z3fooi", während ein C Compiler einfach das Symbol "_foo" in der Objektdatei erwartet. Das liegt einfach daran, dass man in C++ Funktionen überladen kann und diese dann unterscheiden können muss.

Wenn du die Header-Datei einbindest, mußt du bei einem C++ Compiler sicherstellen, das dieser die Funktionsnamen als C-Funktionen erkennt. Das erreichst du, indem du die Funktionsdeklarationen folgendermaßen einschließt:
C:
#ifdef __cplusplus
extern "C" {
#endif

/* hier folgen die Funktionsdeklarationen */
int foo(int a);

#ifdef __cplusplus
}
#endif
Gruß

PS: das ganze Problem hättest du auch umgehen können, indem du aus der .c Datei einfach eine .cpp Datei gemacht hättest.
 
Zurück