2009-09-01 3 views
5

hej.hObjective-C++ символ не найден странность

void hej(); 

hej.m

void hej(){} 

main.mm

#import "hej.h" 

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

} 

Это дает мне:

«Хей() ", ссылка от: _main в main.o Символ (ы) не найден

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

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

+0

ли Objective-C++ переднего плана к GNU Compiler Collection, который может скомпилировать исходные файлы, которые используют комбинацию C++ и синтаксис Objective-C? –

ответ

17

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