Objective-c++符号未找到的奇怪问题

6

hej.h

void hej();

hej.m

void hej(){}

main.mm

#import "hej.h"

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

}

这给我的提示是:

在主文件main.o中引用了"hej()",找不到符号。

如果我将main.mm重命名为main.m(只有一个m),或者将hej.m重命名为mm或cpp,则它可以工作。(虽然这些“解决方案”都不是很理想。假设你想在objc++环境中使用c-lib - 你不想改变整个库,甚至可能无法改变,并且你需要在objc++中使用它。)

到底发生了什么?


Objective-C++是GNU编译器集合的前端,可以编译使用C++和Objective-C语法组合的源文件吗? - Peter Mortensen
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接