Das liegt an der Namensverstümmelung in C++
nm -C
entwirrt sie.
Um Namensverstümmelungen zu verhindern,
- Verwenden Sie einen C-Compiler (gcc, nicht g++), nennen Sie Ihre Quelldatei .c (nicht .cpp)
- oder deklarieren Sie extern "C":
.
meine.h
extern "C"
{
void start();
void finish();
}
Dies gibt ihnen eine "C"-Verknüpfung, was bedeutet, dass sie nicht überladen werden können, nicht als Referenz übergeben werden können, nichts C++ :)
Klingt nach C++-Namensverstümmelung.
Wie andere Antworten bereits erwähnt haben, liegt dies wahrscheinlich an der Verstümmelung von C++-Namen. Wenn Sie möchten, dass das Symbol über seinen „unbeschädigten“ Namen zugänglich ist und in C++ implementiert ist, müssen Sie extern "C"
verwenden um dem C++-Compiler mitzuteilen, dass er eine C-Verknüpfung hat.
In der Kopfzeile mit dem Funktionsprototypen möchten Sie etwas wie:
#if defined(__cplusplus)
extern "C" {
#endif
// the prototype for start()...
#if defined(__cplusplus)
}
#endif
Dadurch wird sichergestellt, dass die Funktion, wenn sie von einem C++-Compiler verwendet wird, den extern "C"
erhält in der Deklaration, und dass es, wenn es von einem C-Modul verwendet wird, nicht durch extern "C"
verwechselt wird Bezeichner.
Ihre Implementierung in der .cpp-Datei benötigt dieses Zeug nicht, wenn Sie den Header vor der Funktionsdefinition einfügen. Es wird die Verknüpfungsspezifikation verwenden, die es aus der vorherigen Deklaration gesehen hat. Ich ziehe es jedoch vor, die Funktionsdefinition immer noch mit extern "C"
zu dekorieren nur um sicherzustellen, dass alles synchron ist (beachten Sie, dass Sie in der .cpp-Datei den #ifdef
nicht benötigen Vorverarbeitungsmaterial - es wird immer als C++ kompiliert.