Linux软件编译安装和相关目录介绍

主要介绍: configure、make、make install、/usr、/usr/bin、/opt 等

1.使用configure、make、make install来编译安装软件

无论是在Linux还是在Unix环境中,make都是一个非常重要的编译命令。不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或 make install。利用make工具, 我们可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序,使用make和makefile工具就可以轻而易举的理顺各个源文件之间纷繁复杂的相互关系。

但是如果通过查阅make的帮助文档来手工编写Makefile,对任何程序员都是一场挑战。幸而有GNU 提供的Autoconf及Automake这两套工具使得编写makefile不再是一个难题。

本文将介绍如何利用 GNU Autoconf 及 Automake 这两套工具来协助我们自动产生 Makefile 文件, 并且让开发出来的软件可以像大多数源码包那样,只需"./configure", "make","make install" 就可以把程序安装到系统中。

生成 Makefile 的来龙去脉

首先进入 project 目录,在该目录下运行一系列命令,创建和修改几个文件,就可以生成符合该平台的Makefile文件,操作过程如下:

  1. 运行autoscan命令
  2. 将configure.scan 文件重命名为configure.in,并修改configure.in文件
  3. 在project目录下新建Makefile.am文件,并在core和shell目录下也新建makefile.am文件
  4. 在project目录下新建NEWS、 README、 ChangeLog 、AUTHORS文件
  5. 将/usr/share/automake-1.X/目录下的depcomp和complie文件拷贝到本目录下
  6. 运行aclocal命令
  7. 运行autoconf命令
  8. 运行automake -a命令
  9. 运行./confiugre脚本

可以通过图1 看出产生Makefile的流程,如图所示:

生成Makefile流程图
生成Makefile流程图

图1. 生成Makefile流程图

如果他人的项目中存在 autogen.sh , 则可以直接运行该文件而不需要一步步运行上面的命令。

安装路径

automake设置了默认的安装路径:

  1. 标准安装路径
    默认安装路径为:$(prefix) = /usr/local,可以通过./configure --prefix=<new_path>的方法来覆盖。
    其它的预定义目录还包括:bindir = $(prefix)/bin, libdir = $(prefix)/lib, datadir = $(prefix)/share, sysconfdir = $(prefix)/etc等等。

对于安装的情况,库将会安装到$(prefix)/lib目录下,可执行文件将会安装到${prefix}/bin

2. 源码安装工具 checkInstall

用 GNU Autoconf 安装程序

一般说来,我们编译安装一个由 GNU Autoconf 配置的程序是采用如下的步骤:

./configure && make && make install

这个 configure 脚本文件是用来“猜”出一系列系统相关的变量,这些变量是在后面的编译过程要用到的。它将检查系统变量值是否满足编译要求,然后使用这些变量在程序包内每个文件夹下生成 Makefile。此外,configure 脚本还会生成其它文件:

  • 每个文件夹/子文件夹下的一个或多个 Makefile(s)
  • 一个名叫 config.status 的脚本
  • 一个文本文件 config.log

Configure 脚本文件成功运行之后, 你会输入 make 来编译程序,得到你需要的可执行文件。如果 make 成功的完成,你可以使用 make install 来安装这个程序。

然而,当你想删除它的时候呢?
Makefile 文件只包括了很少情况下的卸载例程。当然,你可以把程序安装到临时文件夹,然后记下所有由程序生成或修改的文件,最后删除他们。但是如果这个程序要经常重新编译,这样做是非常痛苦的,工作量也相当大。Felipe Eduardo 所写的 CheckInstall 就是用来解决这个问题的。

用Checkinstall安装程序

它采用自己的指令 checkinstall 来代替 make install。其他两个指令保留下来跟以前一样,因此,现在这个指令序列使用 CheckInstall 变成:

./configure && make && checkinstall

指令 checkinstall 不仅默认运行了 make install,而且还监测所有安装过程中的写操作。为此,CheckInstall 使用了 Pancrazio de Mauro 所写的程序 Installwatch。如果添加了相应选项还可,在 make install 成功完成之后,CheckInstall 会产生一个 Slackware-,Debian- (添加-D选项) 或RPM- 安装包,然后按照软件包的默认配置来安装程序,并在当前目录(或标准安装包存储目录)留下一个生成的安装包。你可以通过修改变量 PAK_DIR 来修改这个保存目录。

运行命令“checkinstall –h”显示所有可用的子参数
这些子参数大致分为:

  • 安装选项(Install options)
  • 脚本处理选项(Scripting options)
  • 信息显示选项(Info display options)
  • 安装包选项(Package tuning options)
  • 清除选项(Cleanup options)
  • 关于 CheckInstall (About CheckInstall)。

如果 CheckInstall 带着这些参数运行,它会使用这些参数值来代替配置文件 checkinstallrc 中相应的值。

CheckInstall 也有自己的局限之处。它不能处理静态连接的程序,因为这样 Installwatch 就不能监测到安装过程中修改过文件了。总体说来,有两类连接库:动态的和静态的。这些连接库通过 include 指令整合到程序中。静态连接过的程序已经包含了所有需要的库文件,运行时也就不需要再将这些库载入内存中。这种程序与安装在系统中的连接库无关,因为所谓的连接器(Linker)已经在编译时把这些库内置到可执行程序里了。

checkinstall的配置

你可以通过修改配置文件 /usr/local/lib/checkinstall/checkinstallrc 来改变 checkInstall 的默认配置。
文件值得注意的变量有 INSTYPE,INSTALL 和 PAK_DIR。

  • INSTYPE 变量决定生成何种类型安装包
  • PAK_DIR 变量决定安装包的存储目录。
  • INSTALL 变量决定是只生成安装包还是一起将这个包马上安装。
    0-只生成安装包
    1-不仅生成安装包,还将包立即安装
# 创建deb包而不安装,使用sudo猜测是要先记录要安装的路径
./configure && make && sudo checkinstall -D --install=no 
# 查看生成的deb包中包含了哪些文件
dpkg --contents ***.deb

运行checkinstall制作安装包,生成 rpm(或dep) 包期间会出现一些选项,选择默认的即可。

3.相关目录介绍

/usr和/usr/local目录

在传统的unix系统中,/usr通常只包含系统发行时自带的程序,而/usr/local则是本地系统管理员用来自由添加程序的目录。(这样可能在升级新版系统或新distribution时无须重新安装全部程序. )

对于Linux发行版,如 RedHat, Debian 等等,一个可能的规定是:/usr目录只能由发行版的软件包管理工具负责管理,而对/usr/local却没有这样做。正是因为采用这种方式,软件包管理工具的数据库才能知道在/usr目录内的每一个文件。

比如上面的从源码编译的程序默认安装路径就是/usr/local

/usr/local
This is where most manually installed(ie. outside of your package manager) software goes.It has the same structure as /usr. It is a good idea to leave /usr to your package manager and put any custom scripts and things into /usr/local, since nothing important normally lives in /usr/local.

/bin,/sbin,/usr/sbin,/usr/bin 目录

首先区别下/sbin和/bin:
从命令功能来看, /sbin 下的命令属于基本的系统命令,如shutdown,reboot,用于启动系统,修复系统,/bin下存放一些普通的基本命令,如ls,chmod等,这些命令在Linux系统里的配置文件脚本里经常用到。

从用户权限的角度看, /sbin目录下的命令通常只有管理员才可以运行,/bin下的命令管理员和一般的用户都可以使用。

从可运行时间角度看, /sbin,/bin能够在挂载其他文件系统前就可以使用。

/bin,/sbin目录是在系统启动后挂载到根文件系统中的,所以/sbin,/bin目录必须和根文件系统在同一分区。

/usr/bin,usr/sbin可以和根文件系统不在一个分区。

/usr/sbin存放的一些非必须的系统命令;/usr/bin存放一些用户命令,如led(控制LED灯的)。

补充:

/bin 是系统的一些指令。bin为binary的简写主要放置一些系统的必备执行档例如:cat、cp、chmod df、dmesg、gzip、kill、ls、mkdir、more、mount、rm、su、tar等。

/sbin 一般是指超级用户指令。主要放置一些系统管理的必备程式例如:cfdisk、dhcpcd、dump、e2fsck、fdisk、halt、ifconfig、ifup、 ifdown、init、insmod、lilo、lsmod、mke2fs、modprobe、quotacheck、reboot、rmmod、 runlevel、shutdown等。

/usr/bin 是你在后期安装的一些软件的运行脚本。主要放置一些应用软体工具的必备执行档例如c++、g++、gcc、chdrv、diff、dig、du、eject、elm、free、gnome、 gzip、htpasswd、kfm、ktop、last、less、locale、m4、make、man、mcopy、ncftp、 newaliases、nslookup passwd、quota、smb、wget等。

/usr/sbin 放置一些用户安装的系统管理的必备程式例如:dhcpd、httpd、imap、in.*d、inetd、lpd、named、netconfig、nmbd、samba、sendmail、squid、swap、tcpd、tcpdump等。

opt目录

/opt这个目录是一些大型软件的安装目录,或者是一些服务程序的安装目录

参考

例解 autoconf 和 automake 生成 Makefile 文件
Linux 的源码安装工具 CheckInstall
关于 /usr 和 /usr/local 的讨论
/bin,/sbin,/usr/sbin,/usr/bin 目录
linux下面/usr/local和opt目录有何区别

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容