【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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将C++11标准库静态链接到iOS静态库中,你需要在编译时指定相应的编译选项。具体来说,你需要在编译命令中添加以下参数: ``` -std=c++11 -stdlib=libc++ -fvisibility=hidden -fvisibility-inlines-hidden -miphoneos-version-min=9.0 -isysroot /path/to/iphoneos.sdk -arch armv7 -arch arm64 -isystem /path/to/iphoneos.sdk/usr/include/c++/v1 -L/path/to/iphoneos.sdk/usr/lib/ -lc++abi -lc++ -lm ``` 其中,`-std=c++11`参数指定使用C++11标准编译代码,`-stdlib=libc++`参数指定使用libc++标准库,`-fvisibility=hidden -fvisibility-inlines-hidden`参数指定隐藏符号,`-miphoneos-version-min=9.0`参数指定iOS最低版本为iOS 9.0,`-isysroot`参数指定iPhoneOS SDK的路径,`-arch`参数指定编译的架构,`-isystem`参数指定标准库头文件的路径,`-L`参数指定标准库的路径,`-lc++abi -lc++ -lm`参数指定链接的标准库。 如果你使用的是Xcode进行交叉编译,你可以在Build Settings中设置相应的编译选项。具体来说,你需要将以下编译选项添加到Other C++ Flags中: ``` -std=c++11 -stdlib=libc++ -fvisibility=hidden -fvisibility-inlines-hidden -miphoneos-version-min=9.0 -isysroot /path/to/iphoneos.sdk -arch armv7 -arch arm64 -isystem /path/to/iphoneos.sdk/usr/include/c++/v1 ``` 并将以下链接选项添加到Other Linker Flags中: ``` -L/path/to/iphoneos.sdk/usr/lib/ -lc++abi -lc++ -lm ``` 通过这些设置,你可以将C++11标准库静态链接到iOS静态库中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值