当前位置:首页 > 生活 > 正文

Linux怎么样编译c程序文件(编译最新版ffmpeg为例)(linux如何编译运行c文件)

请关注本头条号,每天坚持更新原创干货技术文章。

如需学习视频,请在微信搜索公众号“智传网优”直接开始自助视频学习

前言

本文主要介绍在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用于连接https/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最新版了。

本文已同步至博客站,尊重原创,转载时请在正文中附带以下链接:

https://www.linuxrumen.com/rmxx/920.html

点击了解更多,快速查看更多的技术文章列表。