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

Dej*_*dar 0 c++ xcode linker-errors swift

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

错误

错误2

我的Sample.h文件(C++):

#if __cplusplus
extern "C" {
#endif

    int getOne();

#ifdef __cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)

我的Sample.cpp文件:

#include <stdio.h>

int getOne()
{
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

我的桥头:

#include "Sample.h"
Run Code Online (Sandbox Code Playgroud)

我试图将函数调用如下:

println(getOne())
Run Code Online (Sandbox Code Playgroud)

笔记:

我确实将C++库添加到项目和构建库(构建阶段),我尝试使用Xcode 6.2(Swift 1.1)和Xcode 6.3(beta Swift 1.2),并且出现相同的错误.

我确实在构建设置中添加了桥接头.

我已经阅读了一些关于在Obj-c中包装我的C++代码的内容,但我还没有完全掌握它.

任何帮助表示赞赏.

Mar*_*n R 5

正如评论中已经说明的那样,错误是只有函数声明被标记为extern"C",而不是定义.

因此,在编译Swift源文件时,编译器会创建对符号"_getOne"的引用,但在编译"Sample.cpp"时,会定义C++错位符号"__Z6getOnev".因此,链接程序失败.

解决方案是包含"Sample.cpp"中的"Sample.h":

#include <stdio.h>
#include "Sample.h"

int getOne()
{
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

因此,extern "C"链接规范也应用于函数定义.

通常,最好从相应的.c/.cpp/.m文件中包含.h文件,以确保实现与公共接口匹配.