6 Stimmen

Objective-c++ Symbol nicht gefunden Seltsamkeit

Hej.h

void hej();

hej.m

void hej(){}

main.mm

#import "hej.h"

int main(int argc, char *argv[])
{

}

Das gibt mir:

"hej()", referenziert von: _main in main.o Symbol(e) nicht gefunden

Wenn ich main.mm in main.m (einfaches m) umbenenne, oder hej.m in mm oder cpp, dann funktioniert es. (Obwohl keine dieser "Lösungen" vorzuziehen ist. Stellen Sie sich vor, Sie wollen eine C-Lib in einer Objc++-Umgebung verwenden - Sie würden nicht die gesamte Lib ändern wollen, vielleicht sogar nicht können, und Sie müssen sie in Objc++ verwenden).

Was genau ist hier los?

17voto

Oren Trutner Punkte 23106

Beim Kompilieren in einer C-Datei ( *.c, *.m ), die Erklärung void hej() erzeugt einen Linker-Verweis auf eine C-Funktion namens _hej . Bei der Kompilierung in einer C++-Datei ( *.cc, *.mm, usw.), erzeugt die Deklaration einen Linker-Verweis auf einen C++-'mangled name', der eine Beschreibung der Argumente enthält. (Dies geschieht zur Unterstützung der Funktionsüberladung, z.B. zur Unterscheidung von void hej(int) de void hej(char*) ). hej.m erzeugt immer den C-Namen. Wenn main.mm auf den C++-Namen verweist, wird er nicht gefunden.

Um das Problem zu lösen, stellen Sie sicher, dass main.mm nach einem C-Namen und nicht nach einem C++-Namen sucht. Wenn Sie hej.h kontrollieren, ist es üblich, etwas wie das Folgende hinzuzufügen, was funktioniert, wenn hej.h entweder in einer C- oder in einer C++-Datei enthalten ist:

/* hej.h */
#ifdef __cplusplus
extern "C" {
#endif

void hej();

#ifdef __cplusplus
}
#endif

Wenn Sie hej.h nicht besitzen, können Sie stattdessen in main.mm Folgendes tun:

extern "C" {
#import "hej.h"
}

int main(int argc, char *argv[])
{
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X