При компиляции в файле C (*.c, *.m
) объявление void hej()
генерирует ссылку компоновщика на функцию C с именем _hej
. При компиляции в файле C ++ (*.cc, *.mm,
и т. Д.) Объявление генерирует ссылку компоновщика на «искаженное имя» C ++, которое включает в себя описание аргументов. (Это сделано для поддержки перегрузки функций, например, чтобы отличить void hej(int)
от void hej(char*)
). hej.m всегда создает имя C. Когда main.mm ссылается на имя C ++, оно не будет найдено.
Чтобы решить, убедитесь, что main.mm ищет имя C, а не C ++. Если вы управляете hej.h, обычно добавляется что-то вроде следующего, что будет работать, если hej.h включен в файл C или C ++:
/* hej.h */
#ifdef __cplusplus
extern "C" {
#endif
void hej();
#ifdef __cplusplus
}
#endif
Если у вас нет hej.h, вы можете вместо этого сделать в main.mm следующее:
extern "C" {
#import "hej.h"
}
int main(int argc, char *argv[])
{
}