【问题标题】:Linker error when trying to call C++ code from Swift尝试从 Swift 调用 C++ 代码时出现链接器错误
【发布时间】:2015-03-29 18:18:21
【问题描述】:

我正在尝试从 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",而不是定义

标签: c++ xcode swift linker-errors


【解决方案1】:

正如评论中已经说明的那样,错误是只有函数 声明被标记为外部“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 文件通常是一种很好的做法,以确保实现 与公共接口匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-21
    • 2020-02-23
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    相关资源
    最近更新 更多