Ciò è dovuto alla manipolazione dei nomi in C++
nm -C
li disgrega.
Per impedire la manipolazione dei nomi,
- usa un compilatore C (gcc, non g++), chiama il tuo file sorgente .c (non .cpp)
- o dichiara extern "C":
.
mio.h
extern "C"
{
void start();
void finish();
}
Questo darà loro il collegamento "C", il che significa che non possono essere sovraccaricati, non possono passare per riferimento, niente c++ :)
Sembra che il nome C++ mutili.
Come hanno già detto altre risposte, ciò è probabilmente dovuto alla manipolazione del nome C++. Se vuoi che il simbolo sia accessibile con il suo nome 'non modificato', ed è implementato in C++, avrai bisogno di us extern "C"
per dire al compilatore C++ che ha un collegamento C.
Nell'intestazione che contiene il prototipo della funzione, vorrai qualcosa del tipo:
#if defined(__cplusplus)
extern "C" {
#endif
// the prototype for start()...
#if defined(__cplusplus)
}
#endif
Ciò assicurerà che se la funzione viene utilizzata da un compilatore C++, otterrà extern "C"
sulla dichiarazione, e che se è usato da un modulo C, non sarà confuso dal extern "C"
identificatore.
La tua implementazione nel file .cpp non ha bisogno di quella roba se includi l'intestazione prima della definizione della funzione. Userà la specifica di collegamento che ha visto dalla dichiarazione precedente. Tuttavia, preferisco ancora decorare la definizione della funzione con extern "C"
solo per assicurarti che tutto sia sincronizzato (nota che nel file .cpp non hai bisogno del #ifdef
roba di pre-elaborazione - sarà sempre compilata come C++.