提纲:
1.iOS编译C++静态库
iOS静态库编译
- 创建 iOS static lib,选择object-c,修改productRef为mainRef,使得可以看到 libxxxx.a;
- 添加cpp文件并命名,其会自动生成hpp文件;
- 在hpp文件中创建类A,并声明相关函数名称;
- 在cpp文件中定义相关函数;
- 将自动生成的.m文件重命名为.mm文件,便可以直接使用c++代码及调用;
- 使用object-c语法编写.h及.mm文件,确保引入使用cpp文件内容;
- 选择需要编译的目标架构类型(iOS真机和iOS模拟器使用不同的架构);
- 在M1笔记本中,macOS编译的库架构与iOS系统得架构不同,故之前的方案失效。
- 编译成功后,可以看到生成的头文件及库文件(.h及.a)
cpp及hpp内容
//hpp
#ifndef world_hpp
#define world_hpp
#include <stdio.h>
#include <iostream>
class HelloTest{
public:
virtual void print();
};
#endif /* world_hpp */
//cpp
#include "world.hpp"
void HelloTest::print()
{
std::cout <<"Hello this is a ios static lib for test !!!" << std::endl;
}
静态库.mm 文件内容
#import "helloWorld.h"
#import "world.hpp"
@implementation helloWorld
+ (void)testCppLib{
HelloTest test = HelloTest();
test.print();
}
@end
2.iOS静态库调用
- 创建 iOS App,选择storyBoard;
- 新建include目录,将静态库头文件及库文件移动至include;
- 编写相关调用代码,使用ViewController.m文件;
- 修改ViewController.m后缀为.mm;
- 进行编译测试;
调用程序 .mm 内容
#import "ViewController.h"
#import "helloWorld.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
[helloWorld testCppLib];
}
@end
部分细节
- 需注意生成库的目标系统及架构与调用的架构是否一致。
- 需要修改调用cpp接口的.m文件后缀为.mm。
3.ffmpeg 静态库编译
主要步骤
- 下载ffmpeg源码 github
- 下载ffmpeg编译脚本 github
- 下载x264及aac源码
- 下载x264及aac编译脚本
- 下载相关支撑文件,按照配置方式进行设置
- 修改相关脚本,编译libx264及fdk-aac
- 将编译后libx264及fdk-aac放至ffmpeg编译目录
- 修改ffmpeg编译脚本使其enable x264及aac
- 编译 ffmpeg 生成静态库。
注意
- ffmpeg、libx264、fdk-aac的架构需要确保一致,如libx264只编译成功arm64,则需要将编译ffmpeg的脚本中arch改为只有arm64,才能成功编译。
4.iOS应用程序调用ffmpeg静态库
- 基本操作流程可参考 iOS应用程序调用C++静态库
-
完成静态库引入后操作:
- 点击仓库进行设置,搜索search,更改
Header/Library Search Paths
为图中所示$(PROJECT_DIR)/xxxxx/FFmpeg/include
或$(PROJECT_DIR)/xxxxx/FFmpeg/lib
- 点击仓库进行设置,搜索search,更改
-
添加ffmpeg库需要的依赖库
-
修改ViewController.mm
#import "ViewController.h"
#import "avformat.h" //测试引入ffmpeg头文件
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
av_register_all(); //测试ffmpeg api调用
}
@end
- 选择目标模拟器,编译测试
5.iOS应用程序调用C++静态库实现调用ffmpeg API
- 在4的基础上,按照3的步骤引入C++静态库(如mediaPower),便可以进行调用C++静态库的形式使用ffmpeg API.
补充信息
-
Ffmpeg编译问题处理:
- https://blog.csdn.net/BranchLin/article/details/83991694
- https://www.jianshu.com/p/4b832101f12b
-
m1 编译库 在 iOS- simulator运行存在问题:
- 解决方式:https://blog.csdn.net/u011224726/article/details/124453819
-
库合并问题处理:https://codeleading.com/article/69214873997/
-
iOS打包静态库,多架构支持: https://www.cnblogs.com/weiming4219/p/7827197.html