您的位置:首页 > 其它

读书笔记---编译程序中的三板斧 推荐

2008-07-16 20:31 357 查看
平时安装软件安装多了,总是少不了./confgiure;make;make install 这三条命令
然而,软件安装完毕,各位有想过这几条命令的意义么?
今天早上看书的时候,谈到C编译程序及调试,于是将书中所说总结出来,以供大家分享吧。
通常一个源码包解压缩以后,我们ls一下,能看到configure文件,通常这是一个可执行脚本文件。由这个脚本文件加上参数,经过运行,生成Makefile文件和其他的一些必要的文件
如果ls没有发现configure文件的话,你第一步执行./configure是没用的。只会得到一条shell返回的错误提示。那么没有configure的程序我们要如何编译呢,通常我们可以看README和INSTALL文件,里面会提示我们用一些其他的程序来生成configure文件。
比如perl脚本写的Makefile.pl,可以用perl Makefile.pl来生成Makefile。
有些程序在执行之前可能需要打上补丁,通常可以找到一些patch文件,
常用 patch -p1 < filename.patch的方法给源码打上补丁。

configrue的开始基本上都是检查编译环境,如gcc编译器的位置,各种库和头文件的位置等等。当检测遇到错误就会停下来。并输出错误信息。对于redhat,建议在安装系统的时候就把开发工具等都全部选中,这样避免编译的时候临时去安装需要的编译工具和一些缺少的库。
有时候我们的系统少一些其他的库,是导致我们编译失败的原因。默认情况下,我们都是运行make来调用系统工具对C代码进行编译。对于某些软件,make后面的参数很长,也比较复杂,这些参数都是什么意思呢。
用postfix举例吧
make -f Makefile.init makefiles 'CCARGS=-DHAS_MYSQL
-I/usr/local/mysql/include/mysql -DUSE_SASL_AUTH
-I/usr/local/include/sasl' 'AUXLIBS=-L/usr/local/mysql/lib/mysql
-lmysqlclient -lz -lm -L/usr/local/lib -lsasl2'
这一大串输入起来是不是很费劲。分别解释一下吧
-I路径 表示在指定路径搜索头文件
-lz 表示搜索libz.so或者libz.a,这里用了缩写的形式,只写了一个z,同理lmysqlclient就表示libmysqlclient.so/libmysqlclient.a
CCARGS表示宏。用于替换makefile中的默认值

make的过程中会生成很多中间文件*.o,最后连接成为可执行文件。make一般时间比较长,取决于CPU的性能了。

接下来一般就是make install了,可是为什么是install参数呢,可以man make看一下,你会发现并没有install这个参数,那么这个参数是哪里来的呢

如果你还没有删除刚才的文件,你可以用编辑器打开Makefile看一下。这里么定义了很多目标字段,格式如下
targert: prerequisite-list
TAB construction-commands
这里的TAB表示一个制表符号,也就是几个像空格一样的空白。
用查找命令从最后找一下,你能找到install开头的目标字段,如果你熟悉程序,你会发现,安装的动作就是从这里开始的。

默认情况下make后面没有指定字段,就从第一个字段开始。当make完成后,我们再次执行make命令是没有效果的,会提示你没有什么可以执行了。因此我们指定一个程序中定义的字段install,来执行特定的安装动作。

对于某些小程序来说,make可能直接就完成了编译和安装的动作,而有些程序是用make
all来完成的。对于一些大型软件,make install之后还可以执行make install-config来安装配置文件等等。现在你明白为啥是make install而不是make love了吧。哈哈
编译失败,需要清理代码树,通常我们用make clean或者make distclean,毫无疑问,这两个参数也是在Makefile中定义好了
如果Makefile中定义了uninstall参数,那么该程序还能卸载。

就到此为止吧。对于编译还有一些其他的开关,有兴趣可以看看相关的开发的书。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息