Je to kvůli změně názvu C++
nm -C
zničí je.
Chcete-li zabránit pozměnění názvu,
- použijte kompilátor jazyka C (gcc, nikoli g++), pojmenujte zdrojový soubor .c (ne .cpp)
- nebo deklarujte externí "C":
.
my.h
extern "C"
{
void start();
void finish();
}
To jim dá vazbu "C", což znamená, že nemohou být přetíženy, nemohou projít odkazem, nic c++ :)
Zní to jako změna názvu C++.
Jak již bylo zmíněno v jiných odpovědích, je to pravděpodobně kvůli změně názvu C++. Pokud chcete, aby byl symbol přístupný pod jeho „nezkomoleným“ názvem a je implementován v C++, budete potřebovat extern "C"
sdělit kompilátoru C++, že má vazbu C.
V záhlaví, které má prototyp funkce, budete chtít něco jako:
#if defined(__cplusplus)
extern "C" {
#endif
// the prototype for start()...
#if defined(__cplusplus)
}
#endif
To zajistí, že pokud je funkce používána kompilátorem C++, dostane extern "C"
na deklaraci a že pokud je používán modulem C, nebude zmaten extern "C"
specifikátor.
Vaše implementace v souboru .cpp tyto věci nepotřebuje, pokud zahrnete hlavičku před definicí funkce. Použije specifikaci propojení, kterou viděl z předchozí deklarace. Dávám však přednost ještě ozdobit definici funkce pomocí extern "C"
jen aby bylo zajištěno, že je vše synchronizováno (všimněte si, že v souboru .cpp nepotřebujete #ifdef
předzpracování – vždy bude kompilováno jako C++.