本节书摘来自异步社区《C程序设计新思维》一书中的第1章,第1.1节,作者 【美】Ben Klemens,更多章节内容可以访问云栖社区“异步社区”公众号查看
第1章 准备方便的编译环境
C程序设计新思维
小心啦,亲爱的,因为我要用点技术。
——选自Iggy Pop的歌曲“Search and Destroy(寻找与毁灭)”
仅仅有C标准库是不足以成就大事的。
实际上C的生态环境已经扩展到了C标准之外,也就是说,如果你想顺利完成本书的练习(即“自己动手”),你就必须了解如何轻松调用那些常用却并非ISO标准的库。不幸的是,这一点恰恰被多数教科书所忽略掉,而需要你自己去寻求解决办法。这也是为什么你发现C的诽谤者们会告诉你一些自相矛盾的言论,比如C已经有40年的历史了,所以你必须自己完成程序的每个部分——他们恐怕根本从来没真正连接过一个库。
本章概要如下:
安装必要的工具。比起那些必须自力更生地寻找每个组件的黑暗时代,现在我们身处的环境要好多了。只要10到15分钟(外加下载这些好东西的时间)你就可以安装好一个完整的开发环境。
如何编译一个C程序。你其实已经知道了怎么做这事儿,但是我们需要一个可以调用库和它们的位置路径的配置;仅仅输入cc myfile.c并不会解决这个问题。make命令是用来提供用于编译程序的最简单的系统,因此它提供了一个好的讨论模型。在这一部分我将展示给大家一个“最小巧但可用”的makefile,并提供了扩展的空间。
无论我们用什么系统,我们都会基于组来讨论环境变量,讨论这些环境变量是做什么的,以及如何配置它们。而当我们准备好了所有的编译机制之后,就会面临一个最容易的环境配置调整问题,即添加新的库。
作为一个附加内容,我们可以用至此学习的知识,准备一个相对简单的编译系统,并将允许我们剪切和粘贴代码到命令行。
针对IDE用户,有一点需要特别说明:你可能不会去使用make命令,但并不因此就说这一章和你没有关系。因为在任何编译方法中make命令都会被执行,所以IDE环境也有一个类似的方法。如果你知道make命令是如何工作的,将更加容易去配置IDE环境。
1.1 使用包管理器
嘿,老兄,如果你还没有在使用包管理器的话,那你可真的错过了好东西。
有几个原因促使我讲述包管理器。
首先,你们中的一些人可能连基本的包管理工具都没有安装。为了这部分读者,我把这部分放在本书的最开始,因为你们需要尽快得到这些工具。一个好的包管理器将为你快速安装POSIX子系统、任何你听说过的语言的编译器、游戏、常用的办公室效率工具,以及几百种C库,等等。
其次,作为一个C程序员,包管理器是我们用来安装常用工作库的关键手段。
再次,当你写过一定的代码,你将开始渴望发布你的代码,从而完成一个从包的下载者到包的贡献者的嬗变。本书将送你一程,为你讲解怎么为自动安装过程准备安装包,这样当一个包库的管理者决定在包库中包含你的代码的时候,他也能顺利地制作最终的包。
如果你是一位Linux用户,你的计算机已经带了包管理器,而且你已知道使用它获取软件是多么容易。对于Windows用户,我将详细讲解Cygwin。Mac用户有几种选择,比如Fink和Macports。所有的Mac下的包管理器都依赖于Apple的Xcode包,也就是一般在系统安装光盘中所使用的(或者含有安装程序的目录,视情况而定),或通过注册为Apple的开发者而得到。
有了包管理器,那么我们需要什么包呢?这里有一个常见的列表。因为每个系统有不同的组织模式,他们中的一些可能也是以不同的方式组合起来的、作为基本包默认安装的,或者有着奇怪的名字。如果你对一个包不是很确定,不妨下载下来安装一下,毕竟系统由于安装了太多的软件包导致不稳定或者变慢的时代已经过去。不过,你可能没有足够的带宽(或者甚至没有足够的硬盘空间)来安装每个可以找到的包,所以还是需要一点判断和选择的。要是你发现错过了什么东西,随时可以折返回来寻找。必须准备的包如下。
一个编译器。gcc是必须安装的;也可能需要Clang。
gdb,一个调试器。
Valgrind,以便测试你的C内存使用错误。
gprof,一个代码剖析器。
make,这样你就再也不用直接调用编译器了。
pkg-config,用来寻找库。
Doxugen,用来产生文档。
一个文本编辑器。理论上说你可以有几百种选择。这里,笔者推荐几种:
——Emacs和vim是那些死硬的极客们喜欢的工具。Emacs是包罗万象的(E代表extensible,扩展);vim则相对采取最简化主义思路并且对键盘输入者比较友好。如果你觉得自己可能会花费上百小时盯在一个文本编辑器上,那么花点时间了解一下它们是值得的。
——Kate的界面是友好而吸引人的,还提供了一些程序员们所期望拥有的便利工具,比如语法高亮检查。
——最后建议你试一下nano,该工具非常简约,并且是基于文本界面的,以至于你连一个GUI[1]界面都不需要。
如果你钟情于IDE,那就安装一个——甚至可以同时安装几个。这方面你同样有很多选择:
——Anjuta:属于GNOME项目。与GNOME的GUI工具Glade可以兼容工作。
——KDevelop:属于KDE项目。
——Code::block:相对简单,在Windows环境下运行。
——Eclipse:简直就是有很多杯托和把手的豪车。并且是跨平台的。
还有一些软件你应该安装,这些工具在随后的几章里我们会频繁用到:
Autotools:Autoconf、Automake、libtool
Git
shell的替代品,比如Z shell。
当然,还有C库这些库可以使你免于“重新发明*”的麻烦(或者,用更加精确的比喻:重新发明火车头)。你可能想要更多的库,但是本书所使用的一般也就限于如下几种:
libcURL
libGlib
libGSL
libSQLite3
libXML2
C库包的命名机制并没有统一标准,所以你必须弄清楚你的包管理器把一个库打进子包的习惯。典型的习惯是,一方面为最终用户准备一个包,另一方面同时为将要在自己程序里使用这些库的开发者也准备一个包;所以要确认选定了基本包和-dev或-devel的包。有的系统把文档也分散进一个单独的包中。也有的要求你单独下载调试符号表。而且一旦需要,gdb工具将在第一次运行并在发现你缺少调试符号表的时候引导你逐步完成。
如果你正在使用POSIX系统,那么完成前面的工具安装后,你已经拥有一个完整的开发系统,可以进入编程阶段了。对于Windows用户,我们将简短说明一下这个安装的系统是如何与Windows主系统互动的。