笨办法学C 练习2:用Make来代替Python

练习2:用Make来代替Python

原文:Exercise 2: Make Is Your Python Now

译者:飞龙

在Python中,你仅仅需要输入python,就可以运行你想要运行的代码。Python的解释器会运行它们,并且在运行中导入它所需的库和其它东西。C是完全不同的东西,你需要事先编译你的源文件,并且手动将它们整合为一个可以自己运行的二进制文件。手动来做这些事情很痛苦,在上一个练习中只需要运行make就能完成。

这个练习是GNU make 的速成课,由于你在学C语言,所以你就必须掌握它。Make 将贯穿剩下的课程,等效于Python(命令)。它会构建源码,执行测试,设置一些选项以及为你做所有Python通常会做的事情。

有所不同的是,我会向你展示一些更智能化的Makefile魔法,你不需要指出你的C程序的每一个愚蠢的细节来构建它。我不会在练习中那样做,但是你需要先用一段时间的“低级 make”,我才能向你演示“大师级的make”。

使用 Make

使用make的第一阶段就是用它已知的方式来构建程序。Make预置了一些知识,来从其它文件构建多种文件。上一个练习中,你已经使用像下面的命令来这样做了:

$ make ex1
# or this one too
$ CFLAGS="-Wall" make ex1

第一个命令中你告诉make,“我想创建名为ex1的文件”。于是Make执行下面的动作:

  • 文件ex1存在吗?
  • 没有。好的,有没有其他文件以ex1开头?
  • 有,叫做ex1.c。我知道如何构建.c文件吗?
  • 是的,我会运行命令cc ex1.c -o ex1来构建它。
  • 我将使用ccex1.c文件来为你构建ex1

上面列出的第二条命令是一种向make命令传递“修改器”的途径。如果你不熟悉Unix shell如何工作,你可以创建这些“环境变量”,它们会在程序运行时生效。有时你会用一条类似于export CFLAGS="-Wall"的命令来执行相同的事情,取决于你所用的shell。然而你可以仅仅把它们放到你想执行的命令前面,于是环境变量只会在程序运行时有效。

在这个例子中我执行了CFLAGS="-Wall" make ex1,所以它会给make通常使用的cc命令添加-Wall选项。这行命令告诉cc编译器要报告所有的警告(然而实际上不可能报告所有警告)。

实际上你可以深入探索使用make的上述方法,但是先让我们来看看Makefile,以便让你对make了解得更多一点。首先,创建文件并写入以下内容:

CFLAGS=-Wall -g

clean:
    rm -f ex1

将文件在你的当前文件夹上保存为Makefile。Make会自动假设当前文件夹中有一个叫做Makefile的文件,并且会执行它。此外,一定要注意:确保你只输入了 TAB 字符,而不是空格和 TAB 的混合。

译者注:上述代码中第四行rm前面是一个 TAB ,而不是多个等量的空格。

Makefile向你展示了make的一些新功能。首先我们在文件中设置CFLAGS,所以之后就不用再设置了。并且,我们添加了-g标识来获取调试信息。接着我们写了一个叫做clean的部分,它告诉make如何清理我们的小项目。

确保它和你的ex1.c文件在相同的目录中,之后运行以下命令:

$ make clean
$ make ex1

你会看到什么

如果代码能正常工作,你应该看到这些:

$ make clean
rm -f ex1
$ make ex1
cc -Wall -g    ex1.c   -o ex1
ex1.c: In function 'main':
ex1.c:3: warning: implicit declaration of function 'puts'
$

你可以看出来我执行了make clean,它告诉make执行我们的clean目标。再去看一眼Makefile,之后你会看到在它的下面,我缩进并且输入了一些想要make为我运行的shell命令。你可以在此处输入任意多的命令,所以它是一个非常棒的自动化工具。

如果你修改了ex1.c,添加了#include<stdio>,输出中的关于puts的警告就会消失(这其实应该算作一个错误)。我这里有警告是因为我并没有去掉它。

同时也要注意,即使我们在Makefile中并没有提到ex1make仍然会知道如何构建它,以及使用我们指定的设置。

如何使它崩溃

上面那些已经足够让你起步了,但是让我们以一种特定的方式来破坏make文件,以便你可以看到发生了什么。找到rm -f ex1的那一行并去掉缩进(让它左移),之后你可以看到发生了什么。再次运行make clean,你就会得到下面的信息:

$ make clean
Makefile:4: *** missing separator.  Stop.

永远记住要缩进,以及如果你得到了像这种奇奇怪怪的错误,应该复查你是否都使用了 TAB 字符,由于一些make的变种十分挑剔。

附加题

  • 创建目标all:ex1,可以以单个命令make构建ex1
  • 阅读man make来了解关于如何执行它的更多信息。
  • 阅读man cc来了解关于-Wall-g行为的更多信息。
  • 在互联网上搜索Makefile文件,看看你是否能改进你的文件。
  • 在另一个C语言项目中找到Makefile文件,并且尝试理解它做了什么。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,743评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,296评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,285评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,485评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,581评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,821评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,960评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,719评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,186评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,516评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,650评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,936评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,757评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,991评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,370评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,527评论 2 349

推荐阅读更多精彩内容