美文网首页
FFmpeg专题1-编译基础

FFmpeg专题1-编译基础

作者: 明日即是今朝 | 来源:发表于2021-10-08 23:33 被阅读0次

编译

ffmpeg专题的第一篇文章,因为ffmpeg是要编译的,所以首先要搞懂编译是个啥,编译的过程都有哪些。不然直接给你一个build.sh的文件写好他的编译脚本,咱们不能理解,那么就不能写出自己的编译脚本,而且在所有第三方的库需要编译的时候,我们都需要先理解这个编译的过程,才能更好的去自定义配置。

编译工具

  1. GCC 使用最广泛,时间最常的编译器
  2. G++ 就是gcc 的 c++版本
  3. Clang apple搞得,编译效率和内存占用比GCC好的编译器,NDK里面在llvm下。

编译过程

  1. 预处理 Processing
    预处理的工作主要是替换Include 以及宏定义等,替换成文本文件。
gcc -E hello.c -o hello.i
  1. 编译 Compilation
    将预处理后的文件编译成对应的汇编代码
gcc -S  hello.c -o hello.s
  1. 汇编 Assemble
    将汇编代码转成机器码
gcc - c hello.s -o test.o
  1. 链接 Linking
    将多个目标文件链接成最终的执行文件,到这里完整的编译流程的结束了。但是如果我们需要链接.a 静态库或者.so动态库还会有点不一样
gcc -o hello.out hello.o

库文件

静态库
  • 定义:静态库在链接阶段会将汇编生成的目标文件与引用到的库一起链接导报到可执行文件中,所有的源文件都会被打入到该静态库中
  • 特点:程序运行的时候与其他的库没有任何关系,只需要该静态库就可以,当然缺点显而易见就是比较大。
  • 工具: 在平台上使用ar 工具来把多个目标文件以及库文件打包为 一个.a 静态库文件
ar rc libhello.a hello.o
r将文件 插入库文件中   c建立库文件
动态库
  • 定义:动态库在链接的时候不会被链接,而是在程序运行才被载入。
  • 特点:链接推迟到程序运行,可以实现进程间的动态库共享,只需要拷贝一份。
  • 工具: 使用gcc g++ clang都可以
1、gcc -fPIC -c hello.cpp  编译成hello.o 注意要加上-fPIC
2、gcc -shared -o libhello.so hello.o    主要加上shared
也可以一步
gcc -fPIC -shared -o libhello.so hello.cpp

链接查找参数

在编译.a 或者.so的时候可能会用到其他的库文件或者头文件,例如ffmpeg在编译的时候,就会用到ndk里面很多的头文件和库文件,来看下链接这些文件的时候参数是怎么配置的

链接库文件
  • -L:xx 指定库文件查找目录
  • -lxx.sp 指定要连接的库名
头文件和库文件都可以查找
  • -sysroot 查找改目录下的usr/include 头文件 和usr/lib库文件
查找头文件

在NDK中查找头文件有好几种指定的方式

  1. -Ixx 使用-I指定头文件的路径 优先级第一
  2. -isystem 直接查找该目录下的头文件 优先级第二
  3. -isysroot 查找该目录下 usr/include 目录 优先级第二 会覆盖-sysroot指定的头文件目录

交叉编译

上面了解了关于c++编译的相关知识,那什么是交叉编译呢? 其实很简单就是android的库文件编译我们使用mac或者linux或者windows来编译,那你肯定不能使用mac自带的gcc来编译,而是需要是用android提供的NDK工具链里面对应平台的编译工具来编译能够让android平台使用的库文件,这就是所谓的交叉编译。

NDK提供的内容

看一下NDK目录下提供给我们的常用的东西,其实主要是两个目录

  1. platforms
    此目录下有很多的android不同level的文件夹,根据我们的需求选择不同的api level,里面提供的是头文件和库文件,也是上面我们介绍的链接和查找头文件或者库文件的目标目录。
  2. toolchains
    此目录是NDK提供给我们使用的编译的工具链,有arm ,arm64,x86等不同平台的工具链。llvm 下面是clang .arm和arm64下使用的是gcc g++。
    重点看下gcc下面常用的编译工具和对应的功能
  • ar 打包目标文件的 如打包.a
  • as 对应的就是编译的汇编那一步,汇编文件编译成目标文件
  • ld 连接器,链接目标和库文件,重定位数据,连接符号引用。
  • nm 列出目标文件中中的符号
  • strip 丢弃目标文件中的符号
  • ranlib 他是用配合ar打包的时候将符号表写入的,其实新版本的ar已经可以包含了ranlib的功能,但是因为很多老项目,还会用到ranlib,所以ranlib就保留着,在ffmpeg中就需要用到ranlib。

关于MakeFile

在ffmpeg的时候我们会使用类似于make clean .make install的命令去执行。其实他执行的就是makeFile文件,那MakeFile文件就可以理解为一个编译脚本。我们上面写的关于编译的流程,以及很多的编译文件都可以写到makeFile这个脚本里面,这样就可以编写MakeFile来控制编译的内容了。但是问题又来了,makeFIle内容还是比较多,写起来比较复杂,可不可以让makeFile自动生成,这个时候就出现了CmakeList 我们只需要去编写CmakeList,这个CmakeList会去指导生成makeFile,makeFile指导编译,这样就完成了整个编译。 关于CmakeList的具体配置,在后续的文章里会慢慢的提到。

相关文章

网友评论

      本文标题:FFmpeg专题1-编译基础

      本文链接:https://www.haomeiwen.com/subject/gszxoltx.html