Itu karena kekacauan nama C++
nm -C
mengacaukan mereka.
Untuk mencegah penguraian nama,
- gunakan kompiler C (gcc, bukan g++), beri nama file sumber Anda .c (bukan .cpp)
- atau deklarasikan extern "C":
.
saya.h
extern "C"
{
void start();
void finish();
}
Ini akan memberi mereka tautan "C", artinya mereka tidak dapat kelebihan beban, tidak dapat melewati referensi, tidak ada c++ :)
Kedengarannya seperti kekacauan nama C++.
Seperti yang telah disebutkan oleh jawaban lain, ini kemungkinan karena kerusakan nama C++. Jika Anda ingin simbol dapat diakses dengan nama 'unmangled', dan diimplementasikan dalam C++, Anda perlu kami extern "C"
untuk memberi tahu kompiler C++ bahwa ia memiliki tautan C.
Di header yang memiliki prototipe fungsi, Anda akan menginginkan sesuatu seperti:
#if defined(__cplusplus)
extern "C" {
#endif
// the prototype for start()...
#if defined(__cplusplus)
}
#endif
Ini akan memastikan bahwa jika fungsi digunakan oleh kompiler C++, itu akan mendapatkan extern "C"
pada deklarasi, dan jika digunakan oleh modul C, tidak akan tertukar dengan extern "C"
penentu.
Implementasi Anda dalam file .cpp tidak memerlukan hal itu jika Anda menyertakan header sebelum definisi fungsi. Itu akan menggunakan spesifikasi tautan yang dilihatnya dari deklarasi sebelumnya. Namun, saya lebih memilih untuk tetap menghiasi definisi fungsi dengan extern "C"
hanya untuk memastikan semuanya sinkron (perhatikan bahwa dalam file .cpp Anda tidak memerlukan #ifdef
hal-hal preprocessing - itu akan selalu dikompilasi sebagai C++.