Eso es debido a la manipulación de nombres de C++
nm -C
los deshace.
Para evitar la manipulación de nombres,
- use un compilador de C (gcc, no g++), nombre su archivo fuente .c (no .cpp)
- o declarar "C" externa:
.
mi.h
extern "C"
{
void start();
void finish();
}
Esto les dará enlace "C", lo que significa que no se pueden sobrecargar, no se pueden pasar por referencia, nada c++ :)
Suena como una manipulación de nombres de C++.
Como han mencionado otras respuestas, es probable que esto se deba a la manipulación del nombre de C++. Si desea que se pueda acceder al símbolo por su nombre 'desenmarañado' y está implementado en C++, deberá extern "C"
para decirle al compilador de C++ que tiene un enlace C.
En el encabezado que tiene la función prototipo, querrá algo como:
#if defined(__cplusplus)
extern "C" {
#endif
// the prototype for start()...
#if defined(__cplusplus)
}
#endif
Esto asegurará que si la función es utilizada por un compilador de C++, obtendrá el extern "C"
en la declaración, y que si es usado por un módulo C, no será confundido por el extern "C"
especificador.
Su implementación en el archivo .cpp no necesita esas cosas si incluye el encabezado antes de la definición de la función. Utilizará la especificación de vinculación que vio en la declaración anterior. Sin embargo, prefiero seguir decorando la definición de función con extern "C"
solo para asegurarse de que todo esté sincronizado (tenga en cuenta que en el archivo .cpp no necesita el #ifdef
cosas de preprocesamiento:siempre se compilará como C++.