Символ Objective-C ++ не найден странным - PullRequest
5 голосов
/ 01 сентября 2009

hej.h

void hej();

hej.m

void hej(){}

main.mm

#import "hej.h"

int main(int argc, char *argv[])
{

}

Это дает мне:

"hej ()", на который ссылаются: _main in main.o символ (ы) не найдены

Если я переименую main.mm в main.m (single m) или hej.m в mm или cpp, то это сработает. (Хотя ни одно из этих «решений» не является предпочтительным. Представьте, что вы хотите использовать c-lib в среде objc ++ - вам не захочется менять всю библиотеку, возможно, даже не сможете, и вам нужно использовать ее в objc ++. )

Что именно здесь происходит?

1 Ответ

17 голосов
/ 01 сентября 2009

При компиляции в файле 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[])
{
}
...