Bootstrap

【iOS】iOS编译C++静态库教程

提纲:

  1. iOS编译C++静态库
  2. iOS应用程序调用C++静态库
  3. ffmpeg静态库编译
  4. iOS应用程序调用ffmpeg静态库
  5. iOS应用程序调用C++静态库实现调用ffmpeg API

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 静态库编译

主要步骤
  1. 下载ffmpeg源码 github
  2. 下载ffmpeg编译脚本 github
  3. 下载x264及aac源码
  4. 下载x264及aac编译脚本
  5. 下载相关支撑文件,按照配置方式进行设置
  6. 修改相关脚本,编译libx264及fdk-aac
  7. 将编译后libx264及fdk-aac放至ffmpeg编译目录
  8. 修改ffmpeg编译脚本使其enable x264及aac
  9. 编译 ffmpeg 生成静态库。
注意
  1. ffmpeg、libx264、fdk-aac的架构需要确保一致,如libx264只编译成功arm64,则需要将编译ffmpeg的脚本中arch改为只有arm64,才能成功编译。

4.iOS应用程序调用ffmpeg静态库

  • 基本操作流程可参考 iOS应用程序调用C++静态库
  1. 完成静态库引入后操作:

    • 点击仓库进行设置,搜索search,更改Header/Library Search Paths为图中所示 $(PROJECT_DIR)/xxxxx/FFmpeg/include$(PROJECT_DIR)/xxxxx/FFmpeg/lib
      请添加图片描述
  2. 添加ffmpeg库需要的依赖库
    请添加图片描述

  3. 修改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

  1. 选择目标模拟器,编译测试

5.iOS应用程序调用C++静态库实现调用ffmpeg API

  • 在4的基础上,按照3的步骤引入C++静态库(如mediaPower),便可以进行调用C++静态库的形式使用ffmpeg API.

补充信息

  • Ffmpeg编译问题处理:

    1. https://blog.csdn.net/BranchLin/article/details/83991694
    2. 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

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;