手记

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


平时安装软件安装多了,总是少不了./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参数,那么该程序还能卸载。

       就到此为止吧。对于编译还有一些其他的开关,有兴趣可以看看相关的开发的书。

   

©著作权归作者所有:来自51CTO博客作者coolerfeng的原创作品,如需转载,请注明出处,否则将追究法律责任

笔记程序读书linux


0人推荐
随时随地看视频
慕课网APP