调用 C++ | Swift
2020-05-22 13:52
3163 查看
Swift 不能直接调用 C++,需要通过 Objective-C/C++ 桥接。本文主要介绍了在 Swift 中调用 C++ 的一些技巧。
调用函数
- 新建 C++ 文件,勾选生成头文件。
// CPPFile.hpp #include <stdio.h> class TestCPP { public: int add(int a, int b); };
// CPPFile.cpp #include "CPPFile.hpp" int TestCPP::add (int a, int b) { return a + b; }
- 新建 Objective-C 文件,此时 Xcode 会提示创建桥接文件,创建即可。这里我们需要调用的是 C++,所以还需要把
.m
文件(Objective-C)改为.mm
文件(Objective-C++)。然后再新建一个头文件,这样就 Objective-C++ 部分就完成了。相关内容如下:
// Project-Bridging-Header.h #import "OCFile.h"
// OCFile.h #import <Foundation/Foundation.h> @interface OCFile : NSObject + (int)sumWithNum: (int)a withNum: (int)b; @end
// OCFile.mm #import "OCFile.h" #import "CPPFile.hpp" @implementation OCFile + (int)sumWithNum: (int)a withNum: (int)b { int sum = TestCPP.add(a, b) return sum; } @end
注意
Xcode 默认把
.h文件当做 Objective-C 而非 Objective-C++ 的头文件,所以在
.h文件中不可以引用任何 C++ 头文件以及引用了 C++ 头文件的头文件,否则会提示
xxx not found。如果这个无法避免,可以考虑使用 opaque pointers。
// CPPClass.h class CPPClass { public: int getNumber() { return 10; } };
// ObjCPP.h struct CPPMembers; @interface ObjCPP : NSObject { // opaque pointer to store cpp members struct CPPMembers *_cppMembers; } @end
// ObjCPP.mm #import "ObjCPP.h" #import "CPPClass.h" struct CPPMembers { CPPClass member1; }; @implementation ObjCPP - (id)init { self = [super init]; if (self) { _cppMembers = new CPPMembers; NSLog(@"%d", _cppMembers->member1.getNumber()); } return self; } - (void)dealloc { delete _cppMembers; } @end
调用静态库
在 Xcode 编译中引入静态库的思路和 gcc/g++ 等编译器相同:首先需要指定库的名字,其次要指定库的路径。
- 指定库的名字:按照下图指示添加想要引入的静态库文件。
- 指定库和头文件的路径:在上一步操作的
Build Phases
旁边找到Build Settings
,然后搜索 “Search Paths”,在Library Search Paths
中添加刚才引入的静态库在本机上的路径。在Header Search Paths
中添加相应的头文件在本机上的路径。
参考
Swift呼叫C++(圖解版)
How to include C++ headers in an Objective C++ header?
相关文章推荐
- swift 调用第三方库中的c++ 注意
- Object-C Swift C++代码相互调用。
- windows和linux环境下java调用C++代码-JNI技术
- c++调用约定(32位程序)
- C++中内存分配、函数调用和返回值
- c# 调用c++的dll文件
- C++:函数的递归调用相关
- c++ 中构造函数的调用先后顺序
- C++:构造函数中调用虚函数
- Swift - 实现日志输出的封装1(显示出调用的文件名、方法、行号)
- Effective C++——》条款9:绝不在构造和析构过程中调用virtual函数
- C++调用C函数
- C# 调用C++ DLL 的类型转换(转载版)
- c++线程调用python
- C++使用new来创建一个对象,析构函数的调用?
- Unity3d 调用C++的DLL
- Mac环境Java通过jni调用C++ OpenCv代码
- Swift基础--调用第三方OC项目
- C#中调用C++写的com时遇到的问题与解决方案
- C#调用C++ DLL简析(一)——生成非托管dll