FreeBSD连载(56):手工编译安装程序
来源: 作者: 出处:综艺读书 2006-10-10手工编译安装程序
|
|
|||
通常在FreeBSD下编译并安装应用程序并不困难,因为FreeBSD是一种非常标 准的Unix,为Unix开发的标准C程序很容易就能在它上面编译运行。
- 编译和软件工具
为了编译和安装一个应用程序,必须要了解编译和运行软件的一般方法。对 于大型程序和要求高效率的软件,通常用高级语言C来开发,使用C语言编译器将C源 程序编译成执行程序。由于使用高级语言不依赖于硬件结构,这使得软件非常容易移 植。Unix不仅提供了编译器,而且还提供了众多的工具来帮助进行编译和维护,最有 用的工具为make。
- GNU C与编译连接过程
C作为一种编译型的高级语言,这就是说运行C程序之前要将其先编译成可执 行的由机器指令构成的执行程序,因此就需要使用一个编译器来对C源代码进行处理 ,FreeBSD使用的是GNU的C编译器。
$ cc hello.c $ ./a.out Hello, world!
UNIX下缺省使用a.out作为生成的文件名,可以使用-o参数指出生成的执行文 件名。
事实上前面的编译生成执行文件的过程由两步组成,一是生成目标文件,通 常使用.o为后缀,然后进行连接生成执行文件。因此,可以使用ar将多个目标文件组 合成一个函数库文件,而可以使用nm来查看库文件的内容。
$ cc -c f1.c $ cc -c f2.c $ ar c mlib.a f1.o f2.o $ nm mlib.a
FreeBSD使用的C语言编译器gcc是一种非常流行的,多平台、高效率的C语言 编译器,它提供了多种选项用于生成应用软件。以下为常用的一些选项:
-L
定义连接库文件的目录
-I
定义C源码的头文件的目录
-o
后面跟的参数为要生成的执行文件的名
-O
进行编译优化,可以指定使用不同的优化级别,从O2到O6,每个不同的级别使用的优化设置不同。
相关的选项还有定义生成的指令码类型的参数,如-m486生成486指令,缺省的gcc版本(2.7.2)不支持Pentium代码。
-g
加入调试代码,可以在完成后使用strip命令删除用于调试的信息
-c
仅仅进行编译而不进行连接,生成目标文件
-fPic
生成相对地址的代码,用于最后生成动态连接库
-static
强制生成静态连接的程序
-aout
生成a.out格式的执行文件、目标代码等,缺省使用ELF格式
-elf
3.0之后为缺省设置,生成ELF格式的目标和执行代码
可以通过命令行参数查看当前使用的GNU C编译器的版本:
$ cc –version Gcc version 2.7.2.1
FreeBSD当前使用GNU的C编译器gcc的版本为gcc 2.7.2.1,这不是 gcc编译器的最新版本,但稳定性非常好。虽然当前新版本的gcc 2.8已经 很稳定了,但是由于编译器在系统中的重要性,编译器出现问题会造成系 统的稳定问题,因此FreeBSD还没有转向gcc 2.8。另一个没有完全使用 gcc 2.8的重要原因是生成的执行文件格式问题,gcc 2.8不再支持生成a.out 执行格式的二进制程序。但完全转向gcc 2.8版本是必然趋势,在当前正在 开发的FreeBSD 4.0-current中,已经使用了gcc 2.8作为标准配置。
在3.1系统中,如果想使用gcc 2.8,就需要安装Packages Collection 中提供的gcc-2.8软件包(或者使用Ports Collection对源代码进行编译)。 事实上还有另外两个更强大的根据gcc进一步开发的编译器,pgcc支持Pentium 代码(标准的gcc只支持生成486代码),egcc除了支持Pentium代码之外,还 提供了更大的优化能力。这些版本是商业公司依据gcc进行的开发,但根据GPL 许可,任意使用者都可以根据需要选择使用,使用这些编译器版本能进一步发 挥系统的能力。
- make
通常应用程序都比较复杂,那么其源程序就不仅包括一个文件,而是 由多个文件构成,这样应用程序的编译和连接过程就相对复杂得多。最简单 的情况下可以使用shell程序来自动完成这个任务,然而由于并不是每次都更 改了所有的文件,每次都完全重新编译所有的代码,不但浪费了处理器资源, 也使得每次作一次小改变就得编译所有得文件,效率低下。最好是能够按照需 要,编译改动过的代码文件,而对没有更新过的文件就不必重新编译,这样就 节约了系统的处理能力。
如果要使用shell脚本来处理这些依赖关系来,则要求根据文件的更新 时间进行维护,需要的shell脚本就比较复杂。Unix提供了一个程序──make, 来帮助按照代码之间的时间依赖关系来进行维护工作。
make与其他解释语言不同,不是直接告诉make需要执行的命令,而是给 定一些依赖规则,即在什么条件下应该执行什么处理,那么make就自动分析文件 的更新时间,完成剩下的工作。规定make规则的文件一般命名为Makefile,这 是一个make指令的集合,这个文件中包括目标定义、执行命令、宏定义和make 伪指令。下面为一个简单的Makefile:
CC = /usr/local/bin/egcc hello: hello.c $(CC) -o hello hello.c clean: echo delete files! rm hello
这个例子中首先定义了一个宏CC,然后定义一个执行目标hello,这个 目标依赖于hello.c文件,一旦hello.c更新,就需要执行下面的编译指令。注意 ,位于定义目标之后的执行命令应该使用一个 “Tab” 制表符引导,而不是其他空 白字符。执行命令中首先将宏替换为它的值,再执行egcc命令编译程序。
一个Makefile文件中可以定义多个目标,如上面例子中的hello和clean, 如果不使用任何命令行参数来启动make,那么缺省使用第一个目标。为了应用其 他的make目标,则必须使用make的命令行参数。
$ make clean delete files!
make使用的缺省文件名为当前目录下的makefile或Makefile,如果使用 其他文件,必须使用命令行参数-f指定文件名。
$ make -f newmakefile
GNU的make命令首先查看的文件名为GNUmakefile。
使用了make,对大型的应用软件进行维护就会容易一些。然而不同的系 统有一些与系统相关的定义,这些定义需要在Makefile中依据不同的系统重新设 置,例如X Window的目录等,这样要完成可以适合多个不同系统的Makefile文件 ,仍然具有困难。有一些工具能帮助进行这些系统相关的设置,并生成Makefile 文件,例如X Window系统使用xmkmf命令和imake模板文件来产生本地的Makefile 文件,这样就能正确侦知本地系统中有关X Window的正确设置,但软件开发者首 先要完成Imakefile文件,以使用xmkmf。而GNU的软件使用autoconf工具,它使 用configure命令用来侦测很多系统相关的设置,如编译器、头文件、库函数等 等,然后使用预设置的Makefile.in模板文件来产生相应的Makefile。有了这些 工具,进行编译各种多平台的应用程序都不再是困难的了。
未完,待续。。。
·系统安装手册 (16426篇文章)
·FreeBSD系统安全管理 (7310篇文章)
·数据库安装与卸载 (8978篇文章)
·FreeBSD使用教程 (5218篇文章)
·Freebsd频道 (618篇文章)
·Freebsd系统安装 (126篇文章)
·FreeBSD系统安装 (178篇文章)
·Freebsd安装/配置 (192篇文章)
·在FreeBSD4.x中制作启动菜单 12-12
·在FREEBSD 5中使用MRTG画图 12-07
·浅谈FreeBSD 5.2常用操作的改变 12-02
·FreeBSD如何通过代理上网更新 11-21
·拿刀砍才能进freebsd系统的修复方法 10-27
·FreeBSD新手建议 10-14
·CERT? Advisory CA-2003-25 Buffer Overflow in Se 10-12
·FREEBSD下使用crunch集成编译程序 10-10
·FreeBSD下配置IPSec:WinXP------FreeBSD 10-10




