22.|22. 编译程序

[TOC]

本章内容:通过编译源代码来创建程序。
编译程序
编译软件的原因:
  1. 可用性。尽管系统发行版仓库中已经包含了大量的预编译程序,但是一些发行版本不可能包含所有期望的应用。 在这种情况下,得到所期望程序的唯一方式是编译程序源码。
  2. 及时性。虽然一些系统发行版专门打包前沿版本的应用程序,但是很多不是。这意味着,为了拥有一个最新版本的程序,编译是必需的。
什么是编译?
编译就是把源码(一个由程序员编写的人类可读的程序描述)翻译成计算机处理器的母语的过程。
编译的过程:
高级语言 => 【编译器】 => 汇编语言 => 【汇编器】 => 机器语言
不是所有的程序都是可编译的。有些脚本语言或解释型语言,如Perl, Python,PHP,Ruby,和许多其它语言不需要编译,可以直接执行。
脚本语言由一个叫做「解释器」的特殊程序执行。
编译一个 C 语言
【22.|22. 编译程序】在 Linux 环境中,普遍使用的 C 编译器叫做 gcc(GNU C 编译器),最初由 Richard Stallman 写出来的。
# 查看 gcc 编译器是否安装 $ which gcc /usr/bin/gcc# 显示 gcc 程序简单描述 $ whatis gcc gcc (1)- GNU project C and C++ compiler

得到源码 diction 是 GNU 项目下的一个小巧方便的程序,用于检查文本文件的书写质量和样式。
# 1. 创建 src 目录 $ mkdir src $ cd src# 2. 使用 ftp 协议下载源码 $ ftp ftp.gnu.org Connected to ftp.gnu.org. 220 GNU FTP server ready. Name (ftp.gnu.org:root): anonymous ...# 跳转到 gnu/diction 目录下 ftp> cd gnu/diction 250 Directory successfully changed.# ls 列出目录下文件会报错:500 ftp> ls 500 Illegal PORT command. # 解决方法 ftp> quote pasv 227 Entering Passive Mode (209,51,188,20,84,170). ftp> passive Passive mode on.ftp> ls 227 Entering Passive Mode (209,51,188,20,107,167). 150 Here comes the directory listing. -rw-r--r--1 30036553468940 Aug 281998 diction-0.7.tar.gz -rw-r--r--1 30036553490957 Mar 042002 diction-1.02.tar.gz -rw-r--r--1 300365534141062 Sep 172007 diction-1.11.tar.gz -rw-r--r--1 300365534189 Sep 172007 diction-1.11.tar.gz.sig 226 Directory send OK.# get 命令:把文件从 ftp 服务器复制到本地机器 ftp> get diction-1.11.tar.gz local: diction-1.11.tar.gz remote: diction-1.11.tar.gz 227 Entering Passive Mode (209,51,188,20,112,178). 150 Opening BINARY mode data connection for diction-1.11.tar.gz (141062 bytes). 226 Transfer complete. 141062 bytes received in 0.74 secs (187.2645 kB/s)# 退出 ftp ftp> bye 221 Goodbye.$ ls diction-1.11.tar.gz# 打开文件 $ tar xzf diction-1.11.tar.gz $ ls diction-1.11diction-1.11.tar.gz# 显示文件内容 $ cd diction-1.11/ $ ls config.guessconfigure.indiction.1.indiction.spec.inen_GB.pogetopt_int.hmisc.cnl.postyle.1.in config.h.inCOPYINGdiction.cdiction.texi.ingetopt1.cINSTALLmisc.hREADMEstyle.c config.subdediction.potengetopt.cinstall-shNEWSsentence.ctest configurede.podiction.specen_GBgetopt.hMakefile.innlsentence.h

构建程序 大多数程序通过一个简单的,两个命令的序列建立:
# configure 程序:分析程序建立环境。 ./configure checking build system type... x86_64-unknown-linux-gnu checking host system type... x86_64-unknown-linux-gnu checking for gcc... gcc checking for C compiler default output file name... a.out checking whether the C compiler works... yes checking whether we are cross compiling... no checking for suffix of executables... checking for suffix of object files... o checking whether we are using the GNU C compiler... yes checking whether gcc accepts -g... yes checking for gcc option to accept ISO C89... none needed checking for a BSD-compatible install... /usr/bin/install -c checking for strerror... yes checking for library containing regcomp... none required checking for broken realloc... no checking for msgfmt... no configure: creating ./config.status config.status: creating Makefile config.status: creating diction.1 config.status: creating diction.texi config.status: creating diction.spec config.status: creating style.1 config.status: creating test/rundiction config.status: creating config.h

configure 命令执行后,会创建了几个新文件。最重要一个是 Makefile。Makefile 是一个配置文件, 指示 make 程序究竟如何构建程序。没有它,make 程序就不能运行。
makefile 文件描述了包括最终完成的程序的各组件之间的关系和依赖性。
构建程序:
# 运行 make 命令并构建程序 make

安装程序 打包良好的源码经常包括一个特别的 make 目标文件,叫做 install。这个目标文件将在系统目录中安装最终的产品,以供使用。 通常,这个目录是 /usr/local/bin,为在本地所构建软件的传统安装位置。
$ sudo make install

make 维护程序的工具
make 程序的另一个重要特征:它保持目标文件是最新的。
构建源码包的三个命令:
./configure make make install

    推荐阅读