微软作为PC操作系统的霸主,确实给广大人民群众带来了便利,让一个完全不懂计算机的小白也能在一台PC上写写文档,玩玩游戏。
对开发者,微软的VS系列也是把便利性做到了极致,但便利,上手快的不好之处是让程序员对编译链接这些过程知之甚少,而在linux下进行编程学习就与win刚好相反,linux学习难度就像lnx,win下的学习难度就像e^x函数。
为了更好理解一个可执行文件是怎么产生的,我们就从Makefile开始聊一聊。
假设有三个文件
在linux下想编译他们并产生可执行文件可以使用
如果文件发生了修改,只要在命令行回滚这条命令就可以了,但是这样做有个问题就是有时会记不清命令,而且换一台电脑的话要重新输入编译命令,而且对于大型项目,改动其中的一个文件却需要重新编译整个项目,这样比较耗时,由于此类种种不便,Makefile便产生了。
先在你的工程文件夹下创建名为Makefile的文件,并输入
需要特别注意的是gcc前面是一个“Tab”,第一行是的意思是我想产生名为hellomake的文件,这个文件的产生依赖于hellomake.c和hellofunc.c,此时Makefile会去当前文件夹下找这两个文件,经过寻找发先这两个文件已经存在了,接下来Makefile就会去执行第二行的命令从而产生可执行文件hellomake。
一般产生一个可执行文件需要编译产生.o和链接产生可执行文件两步,所以我们将这个Makefile写得更清晰一些
CC告诉make我们需要用到的编译器,CFLAGS告诉make编译时需要添加的编译选项,当make看到依赖项为o文件时,make会自动去寻找相应的c文件,并编译他们。
这样做仿佛还是不够好,因为当hellomake.h文件发生变化时,make并不能发现文件的变化,为了解决这个问题,我们将.c文件与.h文件产生依赖
第四行的依赖项表明o文件的产生需要依赖.c和.h文件
%.o指hellomake.o hellofunc.o
%.c指hellomake.c hellofunc.c
$@指的是":"左边所指的内容,
$<指的是依赖的首项,即%.c
新增的语句翻译一下就是
Makefile中提供了$^来表示":"右边的内容,所以我们的代码能做进一步的简化
在一般的工程中,我们都会把所有的c和h放在不同的文件夹中,同时会包含一些库文件,并且隐藏掉不是那么有用的.o文件,一个真实工程中的较为完成的Makefile文件可以写成这样
这只是Makefile皮毛的皮毛,但是已经勉强能用了,Makefile有很多晦涩的语法和隐式规则,那就一点点的看吧。