前言
本文主要介绍在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
那么问题来了,有这样方便的安装方式,为什么还要费劲去编译一个软件呢?
原因是有以下几种情况需要手动编译软件:
本文演示的案例均在CentOS7.6系统上进行记录。
编译案例
FFmpeg 是一个自由软件,可以运行音频和视频多种格式的录影、转换、流功能,包含了libavcodec——这是一个用于多个项目中音频和视频的解码器库,以及libavformat,libavformat是一个音频与视频格式转换库。
安装编译工具及ffmpeg的依赖包。
[root@centos7 ~]# yum install -y automake autoconf libtool gcc gcc-c++ yasm bzip2 make svn git
成功安装编译工具
解释:
通用的编辑工具集:
bzip2用于解压缩bzip2文件
wget用于连接http/https/ftp等协议
ffmpeg本身需要的依赖包,这个需要提前查清楚
远程源码仓库连接工具:
[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最新版了。
本文已同步至博客站,尊重原创,转载时请在正文中附带以下链接:
https://www.linuxrumen.com/rmxx/920.html