我正在使用来自https://www.surina.net/soundtouch/sourcecode.html
的Swift项目的C ++音频处理库我还在Projects-targets-build阶段的编译源中包含了那些cpp文件。
当我尝试在我的桥接标题中导入所有库头文件时
#import "SoundTouch.h"
我在尝试编译时遇到错误
Unknown type of name 'namespace' in STTypes.h
'stdexcept' file not found
我在头文件中使用命名空间
namespace soundtouch { ... }
我不能使用几个标准库也像字符串
#include <stdexcept>
#include <string>
我在这里缺少什么?
答案 0 :(得分:1)
即使在头文件中,Swift也不理解C ++。 C没有名称空间,所以当Swift编译器遇到单词namespace
时,它会认为与C编译器相同,这就是它是变量的名称。但事实并非如此。 Swift也不会理解其他C ++关键字,如class
,也不会理解C ++样式名称修改,即使它有自己的名称,也不是export "C" { ... }
。
如果您要将C ++头文件导入Swift,则必须确保所有C ++内容都隐藏在#ifdef __cplusplus
中,就像在C程序中包含头一样。此外,所有函数声明都需要extern "C"
来禁用名称重整。
你需要一个类的替代声明,你可以使用void*
或者我发现一个不完整的struct
类型工作得很好,你需要创建C包装函数来调用定义的函数在课堂里。以下内容可能会起作用(我还没有测试过)。
#if defined __cplusplus
extern "C" {
#endif
#if defiend __cplusplus
class Foo
{
void bar(int c);
}
#endif
struct FooHandle;
void Foo_bar(struct FooHandle* foo, int c);
#if defined __cplusplus
}
#endif
您需要在C ++文件中定义填充函数
#include MyHeader.h
void Foo_bar(struct FooHandle* foo, int c)
{
((Foo*) foo)->bar(c);
}
道歉,如果我弄错了C ++,我自1998年以来就没有认真对待它