尝试从Swift调用C ++代码时出现链接器错误

时间:2015-03-29 08:58:02

标签: c++ xcode swift linker-errors

我试图从Swift调用一个简单的C ++函数,但我得到 Apple Mach-O链接器错误

Error

Error 2

我的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 ++代码的内容,但我还没有完全掌握它。

感谢任何帮助。

1 个答案:

答案 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文件以确保实现 匹配公共接口。