【问题标题】:Using CPP library in swift project在 swift 项目中使用 CPP 库
【发布时间】:2020-07-02 12:45:06
【问题描述】:

我正在尝试使用 CPP 库。在 iOS 项目中。我对 CPP 的体验非常简短,我不确定如何在 iOS 上执行集成。我尝试了两种选择。

库的静态版本由 .a 和 .h 文件组成。该库的静态版本是为 linux 构建的。这个版本可以在 iOS 上运行吗? 我尝试在 Xcode 中导入静态库,然后我创建了一个桥文件并尝试在那里导入 .h 文件。我收到一条错误消息,告诉我找不到 .h 文件。

在第二个选项中,我尝试在我的项目中导入库的源代码。 Xcode 自动生成桥接头文件。当我尝试运行代码时,我收到一条错误消息,告诉我找不到#include "fftw3.h"fftw3 似乎是我要集成的库使用的库。我找到了适用于 iOS libfftw3f.a 的库的预编译版本。我尝试在 Xcode 中导入,但问题仍然存在。

您知道我应该如何进行吗?库的静态 linux 版本可以在 iOS 上运行还是我应该使用源代码?您对我面临的问题有什么想法或建议吗?

【问题讨论】:

    标签: c++ ios xcode bridging-header


    【解决方案1】:

    首先,您应该确保已链接库所需的所有依赖项。接下来,您需要创建一个 ObjectiveC++ 类(扩展名为 .mm)并创建公共方法,这些方法基本上会将调用转发到 c++ 库。因为不能直接使用 C++ 类。只能通过桥接头使用 ObjC 类。

    例子:

    假设你想使用一些名为 Foo 的 c++ 类,它有一个名为 void bar(); 的方法

    所以你需要用FooWrapper.hFooWrapper.mm文件创建FooWrapper类,在FooWrapper.mm文件中包含c++头文件,并让一个objective-c方法在swift代码中可见:

    FooWrapper.h

    @interface FooWrapper: NSObject
    - (void)bar;
    @end
    

    FooWrapper.mm

    #import "FooWrapper.h"
    #include "..path/to/Foo.h"
    
    @interface FooWrapper()
    @property (nonatomic, assign) Foo *foo;
    @end
    
    @implementation FooWrapper
    //...
    
    - (void)bar
    {
        foo->bar(); //forward call to the cpp lib
    }
    @end
    

    FooWrapper.h 导入到桥接头文件中(就像您通常对要在 swift 代码中使用的常规 ObjC 类所做的那样),并在您的 swift 代码中使用 FooWrapper:

    MySwiftClass.swift

    class MySwiftClass {
        func bar() {
            let foo = FooWrapper()
            foo.bar()
        }
    }
    

    【讨论】:

    • 谢谢。可以肯定的是,对于库,您是指静态库还是使用源代码?
    • 由您选择
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多