Как уже упоминалось в других ответах, это, вероятно, из-за искажения имен в C ++.Если вы хотите, чтобы символ был доступен по его «неупорядоченному» имени, и он реализован в C ++, вам нужно extern "C"
сообщить компилятору C ++, что он имеет связь с C.
Взаголовок с прототипом функции, вам нужно что-то вроде:
#if defined(__cplusplus)
extern "C" {
#endif
// the prototype for start()...
#if defined(__cplusplus)
}
#endif
. Это гарантирует, что если функция используется компилятором C ++, она получит extern "C"
в объявлении, ичто если он используется модулем C, он не будет сбит с толку спецификатором extern "C"
.
Ваша реализация в файле .cpp не нуждается в этом, если вы добавляете заголовок перед определением функции,Он будет использовать спецификацию связи, которую он видел из предыдущего объявления.Тем не менее, я предпочитаю по-прежнему декорировать определение функции с помощью extern "C"
просто для того, чтобы убедиться, что все синхронизировано (обратите внимание, что в файле .cpp вам не нужен материал предварительной обработки #ifdef
- он всегда будет скомпилирован как C ++.