【问题标题】:Swift Bridging header from C++ is not Working来自 C++ 的 Swift 桥接头不工作
【发布时间】:2021-12-05 05:49:54
【问题描述】:

我的需要是我想从我的 cpp 代码中调用一个 swift 函数。为此,我尝试过使用桥接方法。当我尝试从 c 调用 swift 时,它正在工作。由于 C 和 C++ 相似,我在 C++ 中使用了相同的逻辑,但它不起作用。

编译此 CPP 代码会出现类似错误 未定义符号:sayHello() .

我的c和c++示例代码是这样的,

CToSwift-Bridging-Header.h

void callCpp();

extern void sayHello();

ma​​in.c/.cpp

#include <stdio.h>
#include "CToSwift-Bridging-Header.h"

int main(int argc, const char * argv[]) {
    printf("Hello, Main!\n");
    callCpp();
    return 0;
}

void callCpp() {
   printf("CPP: Hi This is C\n");
    printf("CPP: Swift say hello to everyone !\n");
    sayHello();
    printf("CPP: Nice! ");

}

Testswift.swift

import Foundation

    @_cdecl("sayHello")  
    func sayHello()
    {
        print ("Swift:Hello , Welcome to Swift")
    }

在阅读了有关此概念的一些可用文档后,我了解到 Swift (Obj c) 和 C++ 没有直接关系,因为两者都是从 C 以不同的方式演变而来的。

但我的查询是

1] 我在这个桥接头方法中还缺少什么来从 C++ 代码调用 swift 函数吗?

2] 还有其他方法可以实现我的目标吗?

3] 编译 C++ 时能否将 swift 代码作为库或 dll 传递?

【问题讨论】:

  • C++ 不应该是extern "C" 吗?附:桥接头用于将C/Objective-C 导入Swift。对于从SwiftC/Objective-C 的导入,还有另一个标题&lt;ModuleName&gt;-Swift.h

标签: c++ swift objective-c macos bridging-header


【解决方案1】:

这看起来像是名称修改问题。

C++ 将信息添加到对参数和返回类型进行编码的每个函数的名称中,以便使用不同的参数类型进行重载。

包含 C 标头(您的桥接头有效)的一般技巧是 extern "C" { ... } 如果我在 20 年前的 C++ 编程日子没记错的话,它应该是这样的:

#ifdef __cplusplus

void callCpp();

extern "C" {
#endif

extern void sayHello();

#ifdef __cplusplus
}
#endif

extern "C" { ... } 中的所有内容都将被 C++ 编译器视为纯 C,因此不会进行名称修改。如果编译器在 C++ 代码中遇到函数实现,它会记住这一点,并且不会对其应用名称修饰,因此 extern 声明和实现具有匹配的名称。

ifdefs 阻止 C(和 Swift)看到 C++ extern "C" { ... }

假设您希望 callCpp() 使用 C++ 约定,我已将其放在 extern "C" 之外但在 ifdef 内,因此它对 C 和 Swift 程序不可见。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多