Objective-C的++符号找不到陌生感

hej.h

void hej();

hej.m

void hej(){}

main.mm

#import "hej.h" int main(int argc, char *argv[]) { }

这给了我:

“HEJ()”,从引用:_main在main.o中符号(S)未找到

如果我重新命名main.mm到main.m文件(单M),或hej.m以毫米或CPP,那么它的工作原理。 (虽然没有那些“解决方案”是最好想象一下,你要使用C-LIB在objc ++环境 - 你不会想改变整个lib下,甚至不能,你需要使用它在objc ++。 )

究竟是怎么回事?

--------------解决方案-------------

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

分类: 时间:2015-03-15 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.771 (s). 10 q(s)