2009-09-01 56 views
5

hej.h的Objective-C++找不到符號陌生感

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(單個m),或將hej.m重命名爲mm或cpp,那麼它可以工作。 (儘管沒有一個「解決方案」是可取的,但是想象一下你想在objC++環境中使用c-lib - 你不想改變整個lib,甚至不能,你需要在objC++中使用它。 )

這裏究竟發生了什麼?

+0

Objective-C++是GNU編譯器集合的前端,它可以編譯使用C++和Objective-C語法組合的源文件? – 2009-09-01 15:08:08

回答

17

當在C文件(*.c, *.m)編譯,則聲明void hej()產生接頭參考命名_hej C函數。在C++文件(*.cc, *.mm,等)中編譯時,該聲明會生成一個鏈接器引用,指向C++的「損壞的名稱」,其中包含參數的描述。 (這是爲了支持功能過載,例如爲了區分void hej(int)void hej(char*))。 hej.m總是創建C名。當main.mm引用C++名稱時,它不會被找到。

要解決,請確保main.mm查找C名稱,而不是C++名稱。如果你控制hej.h,這是常見的添加類似於以下,當包含在任何一個C或C++文件hej.h這將工作:

/* 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[]) 
{ 
}