在项目中同学难免要在Linux系统下编译源代码,一定会对命令行编译时遇到层出不穷的编译错误头痛不及,很难理解为何Linux系统会用如此变态的编译安装方式呢?
特别对于现在习惯了应用商店一键安装的同学来说,编译源代码简直就是恐怖的令人发指。其实这一点这正是Linux的魅力所在,本文是编译入门,所以不展开说,但简单来讲就是:Windows系统以及手机应用商店是面向终端用户,所以安装程序必须简单。不能够给普通用户设门槛,对于商业世界,每个用户都是¥
;而Linux是面向程序员,采用瑞士军刀
的复用思维,一个开源程序模块写好了全世界用,但是想把用这些程序模块拼凑起来一起用可不容易。
既然是编译安装入门,其实网络上可参考的资料文档并不少,这里我们主要是串联起来一个学习思路,如何编译安装,如何理解编译过程,如何处理编译中遇到的问题。然后配合相关实验更好掌握。
一、如何编译安装
一般来说首先要下载安装包,后缀名是 .tar.gz 结尾的用 tar 命令解压出一个源代码目录,进入源代码目录之后执行下面命令就可以
./configure
make
make install
也可以写成这样更酷的单行方式 ./configure && make && make install
对应实验
- 玩具实验: 为体验这种方式,可以去
iperf
官网下载最新版本测速工具,编译安装试试,简单而容易完成。 - 进阶实验: 可以去
ffmepg
官网下载最新版本,编译安装试试;没有它,就没有我们的音视频世界。
二、如何理解编译过程
- 首先参考文章 https://my.oschina.net/surjur/blog/349464 了解: Linux编译安装中configure、make和make install各自的作用 。 会加上
./configure --prefix=/your_dir
这样的参数,或是理解--enable--xxx --disable-xxx
,至少你折腾起来也容易管理。 - 然后再通过文章,了解 源代码编译、链接和Makefile简介 ,这时应该对Makefile和编译过程应该有相关概念了。
对应实验
-
玩具实验
: 为更好的理解编译过程;需要手写一个Makefile文件,至少包含2-3个有作用的 .c .h 文件,完成编译过程。 -
进阶实验
: 大型项目目录通常会由多个目录组成。 可以试一下建立2-3个子目录,每个目录下包含单独的 Makefile 文件,再通过根目录的 Makefile 文件进行编译。
三、如何解决安装中遇到的问题
Linux安装中遇到的问题可以说千奇百怪,有N
个Linux发行版本,有M
个要编译的软件版本,遇到的问题就能变成至少 M * N
个。为了解决这些复杂问题,大概的思路如下:
1. 收集安装记录文档
应当收集好自己机器的环境版本 uname -a
, 以及安装记录文档(含命令);
留存安装记录文档至少有两个好处:
- 可以和别人的环境版本、文档对比,看看自己的问题出在何处
- 安装一次不易,留存下来后,下次同样版本环境下复制粘贴代码就好,避免重复工作;不记录的情况下,一个参数不对,可以重新折腾上几个小时。现在理解为何网络上很多博客的安装日志吧,就是给自己和别人一个方便。
2. 从错误日志着手
- 检查错误日志出现的位置,是
configure
还是make
还是make install
不同阶段解决的思路不一样。 - 最简单粗暴的方法,把错误日志在
Google
上搜索一下, 变换一下关键词,排名前五的参考意义很大,第二页就不要看了。 别用度娘,别用度娘,别用度娘,重要的事情说三遍,执迷不悟想找莆田系医院就算了。什么,用不了谷歌,想把技术学好,这点困难解决不了您还怎么读研究生. 校园网里试试 ipv6 google 看看~
3. configure 错误
configure
错误通常和库依赖有关系, 简单粗暴的方法解决不了,那您就只能来一般粗暴的方法了。
- 如果对应的库不是那么重要, 试试
configure --disable-xxx
把对应的库屏蔽掉。不知道 disable名称是什么? 别傻乎乎的试, 把所有参数输出到configure --help > cofig.out
某个文件里就能看到了, 所有的enable-xxx
都是可以disable-xxx
的。 - 如果您用的是 ubuntu, 需要熟悉包管理(这能另外开一篇文章),幸运的把对应的库用
apt-get
补齐了就能通过。 - 如果
apt-get
包的版本不够新,自己去官网下载新版本的库编译安装呗,回顾‘一、如何编译安装’ - 注意:有的时候库名称很容易得知,有的时候就是不太确认对应库的名称,这是个艺术,几句话不好说清楚,要从屏幕上的提示配合谷歌领悟了。
一般粗暴的方法解决不了,恭喜你,你是必须跳出 Linux 小白的境界啊。 configure
是用什么语言写的,需要研究一下bash
入门。打开 configure
文件,看看对应错误日志到底出现在哪一行。为什么过不去呢? 了解bash
语法, echo
调试一下,有时就找到问题了。
安装完库之后,执行几个命令譬如 ldconfig
等等也有作用,自行谷歌吧。
4. Make 错误
make
错误通常和缺少库,或是对应库的目录设置有关。看看最后一条make
命令。如果有了Makefile
的基础,在研究下 gcc
, g++
等相关编译参数,把最后一条命令粘贴到命令行中,修订后执行一下,有时改变一下库指向就能执行编译通过了。
如果相关库或是命令修订后已经能正确编译执行的话, 这时你大概清楚错误的库指向发生何处,一般可以用下面几种方法解决
- 修改
PKG_CONFIG_PATH
- 创建正确的库文件软连接
ln -sf 你的库路径 make使用的库路径
- 禁止PATH中搜索到旧版本的命令
mv 旧命令 旧命令+版本号
- 修改
Makefile
(不推荐)
5. Make install
这步错误就少多了,有时是权限的问题 sudo make install
就好
对应实验
- 试试看编译个
nginx
,加上几个模块,这是 internet 上使用最多的 http 服务器。 - 再挑战一下
vlc
6. 补充
- 不知道对应版本的的时候: 执行
对应命令 --version 或是 -v
试一下; 或是apt-get version 库名称
- 不知道什么参数时,执行
对应命令 --help
- 守着现成的编译命令和代码,直接看参数说明
--help
,configure
,Makfile
代码吧,有时比你在搜索引擎上反复搜来搜去还节省时间,慢就是快。