qua*_*ano 5 header objective-c++ symbol-not-found
hej.h
void hej();
Run Code Online (Sandbox Code Playgroud)
hej.m
void hej(){}
Run Code Online (Sandbox Code Playgroud)
main.mm
#import "hej.h"
int main(int argc, char *argv[])
{
}
Run Code Online (Sandbox Code Playgroud)
这给了我:
"hej()",引自:未找到main.o符号中的_main
如果我将main.mm重命名为main.m(单个m),或者将hej.m重命名为mm或cpp,那么它可以正常工作.(虽然这些"解决方案"都不是优选的.想象一下你想在objc ++环境中使用c-lib - 你不想改变整个lib,甚至可能不会,你需要在objc ++中使用它. )
到底发生了什么?
Ore*_*ner 17
在C文件(*.c, *.m)中编译时,声明会void hej()生成对名为C函数的链接器引用_hej.当在C++文件(*.cc, *.mm,等)中编译时,声明会生成对C++'mangled name'的链接器引用,其中包含参数的描述.(这样做是为了支持函数重载,如区分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
Run Code Online (Sandbox Code Playgroud)
如果您不拥有hej.h,则可以在main.mm中执行以下操作:
extern "C" {
#import "hej.h"
}
int main(int argc, char *argv[])
{
}
Run Code Online (Sandbox Code Playgroud)