cygwin + gcc+makeFile入门(一): Mafile的基本指令

晨曦之光 发布于 2012/03/09 12:11
阅读 581
收藏 1

 别指望这篇文章帮你搭建Cygwin的环境。 因为说这个的太多。这篇文章的环境是Cygwin的开发环境。

 

这篇文章将指引如何写MakeFile, 以及Gcc编译的几个常用开关:

 

 

MakeFile的思想:提供一个细分的方法,把一个总目标让你细化成小目标, 小目标执行完之后,总目标最后再执行。

MakeFile的基本格式:

 

总体目标:依赖目标1【空格】 依赖目标2
【Tab】任何shell指令包括gcc
依赖目标1:其它依赖目标
【Tab】任何shell指令包括gcc
依赖目标2:其它依赖目标
【Tab】任何shell指令包括gcc
……

 

举例有一个如下的MakeFile文件:

#this is the first example of make file
allTarget:c_target a_target b_target
	gcc a.o b.o c.o -o tiantian.exe
	rm -rf a.o b.o c.o
c_target:
	gcc -c c.cpp -o c.o
b_target:
	gcc -c b.cpp -o b.o
a_target:
	gcc -c a.cpp -o a.o

 

目标生成一个exe文件, 但生成该exe文件需要编译三个源文件:a, b, c。 在上述MakeFile文件中,把编译这三个源文件

的任务分解成a_target, b_target, c_target,  分别实现之后,才最终到allTarget这个最终目标上来。

 

源文件a.ccp, b.cpp, c.cpp是这样的关系:

a.cpp是Main函数所在的源文件,需要调用b.cpp的functionB();

b.cpp中的functionB需要调用c.cpp中的函数functionC();

 

当然编译并不需要从c到a这样编译, 因为编译的时候只需要找到声明文件就通过。所以,目标a_target, b_target, c_target

实质上是并列关系。

 

.h文件不需要作为目标, 因为gcc自动查找。

 

gcc的编译开关-c表示编译完之后,不再汇编和link【我们习惯的不带任何参数的gcc指令把什么问题都全做了,当然做之前,要判断先后顺序,这会花掉不少时间】

 

这里提倡的是: gcc -c 编译成.o 文件,然后用gcc 不带开关的选项将.o编译成.exe文件,

 

这里就两个gcc指令,容易吧!

 

OK, that‘s ALL

 

源代码下载地址:http://download.csdn.net/source/1823622

 

再补充一点进阶的知识:

 

上面的方式, 并非很实用,原因是,每次make的时候,文件都会编译,连接, 但实际情况是:我只想当文件改变的时候,才去编译和连接,怎么做到这一点?

 

makefile帮我们做到了,那就是,所有的目标,及其依赖目标,都以文件的形式组织,如,我们的目标是c_target将改名为c.o目标,它依赖c.cpp, c.h, c.o 发生了变化,则执行目标的命令,否则不执行。

 

所以,选择性的编译,得到了很好的贯彻,具体如下:

 

bTarget:
 gcc -c b.cpp -o b.o

任何时候都要执行编译指令


b.o:
 gcc -c b.cpp -o b.o
 
表示: 当b.o文件存在的时候, 不执行编译指令, 不存在b.o文件时,才编译


c.o: c.cpp w.cpp
 gcc -c c.cpp -o c.o

表示当c.cpp出现更新, 或者w.cpp出现更新,或者b.o存在三者之一成立,则编译. 反之不编译


所以,拿文件当条件的好处彻底体现

 

另外需要注意的是,cc 可以代替gcc

 

 推荐阅读:GNU+make中文手册 , 到CSDN上面去搜索就有

 

makeFile中增加include路径:

 

项目为了便于管理,不同类别的头文件放到不同目录,因此需要指明这些不同路径,方便在Include的时候,将这些文件引入进来。

 

方法: -I."PathName", 比如源文件所在的文件夹下,有一个include文件夹需要引入,则采用:

 

-I./include即可, "./"表示当前路径; "../"表示上级路径

 

 

 

参考资料:


Linux 常用的Makefile模板

 

 

延伸阅读:

 

向大家推荐一个C/C++通用Makefile

 

 


原文链接:http://blog.csdn.net/ostrichmyself/article/details/4846956
加载中
返回顶部
顶部