别指望这篇文章帮你搭建Cygwin的环境。 因为说这个的太多。这篇文章的环境是Cygwin的开发环境。
这篇文章将指引如何写MakeFile, 以及Gcc编译的几个常用开关:
MakeFile的思想:提供一个细分的方法,把一个总目标让你细化成小目标, 小目标执行完之后,总目标最后再执行。
MakeFile的基本格式:
举例有一个如下的MakeFile文件:
目标生成一个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即可, "./"表示当前路径; "../"表示上级路径
参考资料:
延伸阅读: