我试图从Swift调用一个简单的C ++函数,但我得到 Apple Mach-O链接器错误:
我的Sample.h文件(C ++):
#if __cplusplus
extern "C" {
#endif
int getOne();
#ifdef __cplusplus
}
#endif
我的Sample.cpp文件:
#include <stdio.h>
int getOne()
{
return 1;
}
我的桥头:
#include "Sample.h"
我试图将函数调用为:
println(getOne())
备注:
我确实将C ++库添加到了项目和构建库(构建阶段),我尝试使用Xcode 6.2(Swift 1.1)和Xcode 6.3(beta Swift 1.2)编写代码,并且出现相同的错误。
我确实在构建设置中添加了桥接标题。
我已经阅读了一些关于在Obj-c中包装我的C ++代码的内容,但我还没有完全掌握它。
感谢任何帮助。
答案 0 :(得分:5)
正如评论中所述,错误是只有函数 声明标记为extern&#34; C&#34;,但不是定义。
因此,在编译Swift源文件时,编译器会创建 对符号&#34; _getOne&#34;的引用,但在编译&#34; Sample.cpp&#34;时, C ++错位符号&#34; __Z6getOnev&#34;被定义为。因此链接 该计划失败。
解决方案是包括&#34; Sample.h&#34;来自&#34; Sample.cpp&#34;:
#include <stdio.h>
#include "Sample.h"
int getOne()
{
return 1;
}
以便extern "C"
链接规范也应用于函数定义。
通常优良做法是从相应的.c / .cpp / .m文件中包含.h文件以确保实现 匹配公共接口。