前言
本文主要介紹在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最新版了。
本文已同步至博客站,尊重原創,轉載時請在正文中附帶以下鏈接:
https://www.linuxrumen.com/rmxx/920.html