《Linux程序设计》——读书笔记(2)

Linux环境:

无论操作系统何时启动一个新程序,参数argc和argv都会被设置并传递给main(即使main函数未声明参数,此时只是不能使用这些参数)。这些参数通常由另一个程序提供,一般是shell,它要求操作系统启动该新程序。shell会接受用户输入的命令行,将命令行分解成单词,然后把这些单词放入argv数组。

命令行参数在向程序传递信息方面很有用,很多工具程序使用命令行参数来改变程序的行为或设置选项(这一点我们很熟悉,但是可能很少会联想到正是argc、argv参数在这里发挥作用)。

尽管命令行选项很常用也很有用,但是应注意遵循相同的方式。建议:在应用程序中,所有的命令行开关都以一个短横线开头,其后包含单个字母或数字;如果需要,不带后续参数的选项可以在一个短横线后归并到一起;如果某个选项需要值,则该值应作为独立的参数紧跟在该选项后。

 

一句话GNU/Linux历史:为了取代Multics系统,Thompson和Ritchie开发了原始的UNIX系统;Richard Stallman为了构建一个任何人可以使用的、免费的类UNIX操作系统,创立了GNU和FSF;Linus Torvalds在Minix基础上创造了Linux内核;最终,Linux和GNU一拍即合,诞生了GNU/Linux操作系统。

BSD是另一个重要的类UNIX操作系统,是GNU/LINUX的有力竞争对手。

 

由源代码生成可执行文件:

手工编译:gcc命令——不自动、不智能

生成脚本——自动化、不智能

make工具——自动化、智能化

大多数大型的Linux软件项目开发都没有直接使用make,而是使用基于GNU make的“GNU automake/autoconf”工具

Makefile是一个依赖树,从上到下逐级展开。

 

当项目很庞大时,尽管make依然是一个有力的工具,但是要想维护好Makefile确是十分困难的,因此诞生了GNU自动工具“automake/autoconf”——为生成项目自动生成适当的Makefile文件

使用automake/autoconf自动工具的最大好处是,可以依据环境自动生成make工具所需的Makefile文件,同时极大的方便了Makefile的后期维护工作。

自动工具的使用:

1.为源代码项目添加三类文件

(1) autogen.sh     运行自动工具的shell脚本(位于项目根目录)

(2) configure.ac    autoconf工具的输入文件(位于项目根目录)

(3) Makefile.am    顶层的Makefile模版(项目根目录及有源代码要编译的各级子目录都要有各自的Makefile.am文件)

2.在命令行执行如下命令

  # ./autogen.sh

  # ./configure

  # make

---------------------------------------------------------------------------------------------------------------------------

分步解析:

(1) 运行脚本autogen.sh:建立automake和autoconf工具工作所需要的本地环境;

                                             运行automake工具将Makefile.am文件转换为Makefile.in文件;

                                             运行autoconf工具,将configure.ac文件转化为名为“configure”的纯shell脚本。

(2) 运行脚本configure:收集执行系统的信息;

                                          通过替换步骤将Makefile.in模板转化为实用的Makefile文件(可能是多个Makefile文件)。

(3) 运行make工具:根据生成的Makefile文件对各级源文件进行编译链接,生成最终的可执行文件。

---------------------------------------------------------------------------------------------------------------------------

要体会automake和autoconf工具的优越性,不是一件容易的事,但这确是当今大型开源项目广泛使用的方法。

《Linux程序设计》——读书笔记(2),古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。