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

Linker error when trying to call C++ code from Swift

我试图从 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++ 代码的内容,但我不太能做到。

感谢任何帮助。

如评论中所述,错误是只有功能 声明被标记为 extern "C",但不是定义。

所以在编译Swift源文件时,编译器创建 对符号“_getOne”的引用,但在编译时 "Sample.cpp", 定义了 C++ 损坏符号“__Z6getOnev”。因此链接 程序失败。

一个解决方案是从 "Sample.cpp":

中包含 "Sample.h"
#include <stdio.h>
#include "Sample.h"

int getOne()
{
    return 1;
}

这样 extern "C" 链接规范也适用于函数定义。

从相应的.c/.cpp/.m文件中包含.h文件通常是一个好的做法,以确保执行 匹配 public 接口。