智传网优云课堂,专注分享IT技术
与IT技术爱好者一起共同学习进步

Linux怎么样编译c程序文件(编译最新版ffmpeg为例)

前言

本文主要介绍在Linux上怎样把源代码编译成机器可以识别的二进制文件。

首先,我们要理解为什么要编译软件。

编译软件的原理:把人类可读的代码翻译成为机器可以直接识别的二进制文件。

我们安装软件时,一定要编译吗?答案是否定的,因为完全可以使用别人编译好的程序直接安装到我们的系统中。比如常见的Windows安装软件的方式就是直接下载别人编译好的二进制文件。例如,下载最新版的qq安装文件,qq.exe。

同样的,在Linux上一样可以使用这种方法安装,比如在红帽系列的系统上就可以下载.rpm文件进行安装。Debian系列的系统就可以在网上下载.deb文件在本地进行安装,比如Ubuntu系统。
如果需要安装一个软件,其实可以不需要编译,直接使用软件包管理工具安装即可,比如在CentOS上,安装xxx软件。

[root@centos7 ~]# yum -y install xx

Ubuntu系统使用apt命令安装

oucanrong@zcwyou:~$ sudo apt install -y xxx

那么问题来了,有这样方便的安装方式,为什么还要费劲去编译一个软件呢?

原因是有以下几种情况需要手动编译软件:
– 系统默认仓库没有这个软件
– 系统默认仓库的软件过时或者版本太旧不能满意使用要求,比如在Ubuntu 18.04默认仓库上的youtube-dl,已经过时并不能正常使用。
– 软件作者需要发布编译好的二进制包。

本文演示的案例均在CentOS7.6系统上进行记录。

编译案例

FFmpeg 是一个自由软件,可以运行音频和视频多种格式的录影、转换、流功能,包含了libavcodec——这是一个用于多个项目中音频和视频的解码器库,以及libavformat,libavformat是一个音频与视频格式转换库。

安装编译工具及ffmpeg的依赖包。

[root@centos7 ~]# yum install -y automake autoconf libtool gcc gcc-c++ yasm bzip2 make svn git

成功安装编译工具

解释:
通用的编辑工具集:
– make
– automake
– autoconf
– libtool
– gcc
– gcc-c++
– bzip2
– wget

bzip2用于解压缩bzip2文件
wget用于连接http/https/ftp等协议

ffmpeg本身需要的依赖包,这个需要提前查清楚
– yasm

远程源码仓库连接工具:
– svn
– git

[root@centos7 ~]# wget https://ffmpeg.org/releases/ffmpeg-4.1.tar.bz2

正在下载最新版本的ffmpeg等待编译

解压压缩包内容:

[root@centos7 ~]# tar jxvf ffmpeg-4.1.tar.bz2

解压时可以看到很的.c后缀的文件,表示这是C语言写的程序

进入解压后的目录

[root@centos7 ~]# cd ffmpeg-4.1

编辑、编译和安装

[root@centos7 ffmpeg-4.1]# ./configure && make && make install

解释以上命令:
./configure表示软件配置,比如编译哪些组件、开启哪些功能、编译成功后安装到哪些目录等等。
make表示开始编译,把人类可读的代码编译为机器识别的二进制码。
make install编译成功后,把相关的二进制文件、帮助文件等等内容复制到指定目录。

编译一般需要比较长时间,类似于以下输出。

INSTALL libavutil/tree.h
INSTALL libavutil/twofish.h
INSTALL libavutil/version.h
INSTALL libavutil/xtea.h
INSTALL libavutil/tea.h
INSTALL libavutil/lzo.h
INSTALL libavutil/avconfig.h
INSTALL libavutil/ffversion.h
INSTALL libavutil/libavutil.pc

正在编译最新版的ffmpeg

查看ffmpeg的程序位置

[root@zcwyou ffmpeg-4.1]# which ffmpeg

/usr/local/bin/ffmpeg

可以看出,ffmpeg已经编译好了,并且已经复制到了/usr/local/bin/

[root@zcwyou ffmpeg-4.1]# ffmpeg

ffmpeg version 4.1 Copyright (c) 2000-2018 the FFmpeg developers
built with gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-36)
configuration:
libavutil 56. 22.100 / 56. 22.100
libavcodec 58. 35.100 / 58. 35.100
libavformat 58. 20.100 / 58. 20.100
libavdevice 58. 5.100 / 58. 5.100
libavfilter 7. 40.101 / 7. 40.101
libswscale 5. 3.100 / 5. 3.100
libswresample 3. 3.100 / 3. 3.100
Hyper fast Audio and Video encoder
usage: ffmpeg [options][[infile options] -i infile]… {[outfile options] outfile}…

Use -h to get full help or, even better, run ‘man ffmpeg’

查看ffmpeg的版本

查看ffmpeg依赖哪些动态库

[root@zcwyou ffmpeg-4.1]# ldd ffmpeg

linux-vdso.so.1 => (0x00007ffc454d7000)
libm.so.6 => /lib64/libm.so.6 (0x00007fe6c8f6b000)
libxcb.so.1 => /lib64/libxcb.so.1 (0x00007fe6c8d43000)
libxcb-shm.so.0 => /lib64/libxcb-shm.so.0 (0x00007fe6c8b3f000)
libxcb-shape.so.0 => /lib64/libxcb-shape.so.0 (0x00007fe6c893b000)
libxcb-xfixes.so.0 => /lib64/libxcb-xfixes.so.0 (0x00007fe6c8733000)
libva.so.1 => /lib64/libva.so.1 (0x00007fe6c8513000)
libbz2.so.1 => /lib64/libbz2.so.1 (0x00007fe6c8303000)
libz.so.1 => /lib64/libz.so.1 (0x00007fe6c80ed000)
liblzma.so.5 => /lib64/liblzma.so.5 (0x00007fe6c7ec7000)
libva-drm.so.1 => /lib64/libva-drm.so.1 (0x00007fe6c7cc4000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fe6c7aa8000)
libc.so.6 => /lib64/libc.so.6 (0x00007fe6c76db000)
/lib64/ld-linux-x86-64.so.2 (0x00007fe6c926d000)
libXau.so.6 => /lib64/libXau.so.6 (0x00007fe6c74d7000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fe6c72d3000)
libdrm.so.2 => /lib64/libdrm.so.2 (0x00007fe6c70c1000)

查看ffmpeg依赖哪些动态库
如果提示没有找到某某动态库,继续使用yum/RPM/源码安装的方式安装对应的动态库,否则程序不能正常运行。

总结

至此,已经把一个C程序的源代码文件编译成为二进制文件。现在可以直接使用ffmpeg最新版了。

赞(1)
分享到: 更多 (0)

学习QQ群:557371664

关注微信公众号自助视频学习

评论 抢沙发

评论前必须登录!