提问者:小点点

在swift项目中使用CPP库


我正在尝试使用CPP库。 在一个iOS项目中。 我使用CPP的经验非常短暂,我不确定如何在iOS上执行集成。 我试过两个选择。

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

在第二个选项中,我尝试在我的项目中导入库的源代码。 Xcode自动生成桥接头文件。 当我试图运行代码时,我得到一个错误,告诉我无法找到#include“fftw3.h”FFTW3似乎是我试图集成的库所使用的库。 我找到了一个预编译版本的iOSlibfftw3f.a库。 我尝试在Xcode中导入,但问题仍然存在。

你知道我该怎么做吗? 该库的静态linux版本在iOS上工作吗?还是我应该使用源代码? 你对我面临的问题有什么想法或建议吗?


共1个答案

匿名用户

首先,您应该确保链接了库所需的所有依赖项。 接下来,您需要创建一个ObjectiveC++类(扩展名为。mm),并创建public方法,这些方法基本上将调用转发到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()
    }
}