【Linux学习】Makefile学习(二)


如果没有像windows下面的IDE,要想编译一个工程文件,需要怎样实现呢?例如:把windows下面的工程文件放到Linux下面,该怎样让它运行呢?下面我们先来了解两个概念:编译、链接。

当我们习惯了在windows下编程,我们写完程序后,只要点击一下按钮就可以执行,产生了可执行的文件。我们就会相当然的认为是这样:只要我们正确的写出程序然后点击按钮就可以了。其实,windows下的IDE为我们隐去了“编译”,“链接”。无论是C还是C++,首先要把源文件编译成中间代码文件,在Linux下就是“.o”后缀的文件,这个动作叫做编译。而链接就是把这些中间代码文件合成可执行文件。

Linux中,运行工程文件时,会用Makefile来完成编译连接的功能从而生成可执行文件。当我们将Makefile写好,然后运行make后,就会生成可执行文件。在Makefile中会定义一系列的规定,指定哪些文件先编译,哪些文件后编译等一系列的操作。假如在一个工程文件中,写好了正确的Makefile,感到好奇的是:为什么执行make后就会出现可执行文件,Make的工作原理是什么?

其实,当我们输入make后,make首先在当前目录下找到Makefile或者makefile文件,找到makefie后,会找到文件中的第一个目标文件ABC_1(自己假设的),并且会把此文件作为最终的目标文件。如果ABC_1不存在或者ABC_1后面依赖的ABC_2.o文件的修改时间要比ABC_1新,那么就会执行后面所定义的命令来生成ABC_1。但,如果ABC_1所依赖的ABC_2.o文件也不存在,那么make就会在此目录下找生成ABC_2.o所依赖的文件ABC_3.o,再根据生成规则生成ABC_2.o,就这样想一种递归的方式来寻找文件的依赖关系,直到找到最开始生成的目标文件。

下面是学习Makefile时写的两个程序:

源程序文件1:

\

Makefile文件:

\

运行的结果:<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PGltZyBzcmM9"http://www.2cto.com/uploadfile/Collfiles/20140526/2014052609051839.jpg" alt="\">

第一个程序的源文件就是一个简单的printf()函数,makefile中的hello就是最终要生成的目标文件,冒号后面是hello要依赖的文件,再后面就是生成hello所需要的命令。后面的"clean",和第一个目标文件没有联系,那么它定义的命令就不会自动的执行。因此,当要清除程序执行过程中产生的文件时就输入:make clean

源程序文件2:

\

\

Makefile文件:

\

运行的结果:


第二个程序中,有两个源文件,makefile中的Helloworld是最终要生成的目标文件,然后make会找到Helloworld的依赖文件main.o,此时main.o并不存在,make会继续寻找生成main.o的规则,生成main.o,然后make会找到Helloworld的依赖文件a.o,a.o也不存在,然后make找到生成a.o的规则,生成a.o,并最终生成了Helloworld

相关内容

    暂无相关文章