您的位置:首页 > 其它

使用makefile的简单例子

2005-03-11 09:05 253 查看
使用makefile的简单例子

用一个例子来说明如何编写makefile.

程序源代码:
//file: a.h
#ifndef a_h
#define a_h

class A {
public:
  A();
  ~A();
  void f();
};

#endif //a_h

//file: a.cpp
#include "a.h"
A::A(){
}
A::~(){
}
void A::f(){
}

//file: b.h
#ifndef b_h
#define b_h

class B{
public:
  B();
  ~();
  void g();
};

#endif //b_h

//file: b.cpp
#include "b.h"
B::B(){
}
B::~B(){
}
void B::g(){
}

//file: main.cpp
#include "a.h"
#include "b.h"

int main()
{
   A a;
   B b;
   b.g();
   return 0;
}

上面源程序的组织形式应该是最常见的一种了。那么现在要编写

一个makefile文件,让编译器自动地进行编译。
首先,makefile文件就是由一条一条的目标依赖命令组成的,

通常一条这样的命令分成两行来写,第二行通常
是编译连接命令。并且要行首以<TAB>键开头,紧接着命令。

make程序将一条一条的执行这些命令。

其次,目标依赖命令的形式是

target : dependencies
<tab>  command args

现在要搞清楚,用什么编译命令。由于是在unix/linux上,

所以自然应该是cc/gcc/g++了。

还要清楚一点:最后的可执行目标程序是由所有的.cpp文件

经过编译后的.o文件一起构成的。

好了,现在开始编写makefile文件了。

我们假定最后生成的可执行目标名称是exam。

#comment , start with #(sharp)

exam : main.o a.o b.o
    g++ main.o a.o b.o -o exam
main.o : main.cpp a.h b.h
    g++ -c main.cpp -o main.o
a.o : a.cpp a.h
    g++ -c a.cpp -o a.o
b.o : b.cpp b.h
    g++ -c b.cpp -o b.o
#makefile end

请注意每个命令都是以<TAB>键开始的。

写好后,放到源文件所在目录。

然后运行

$ make

就会看到你用到的编译命令行了。

当然可以在makefile文件中使用宏变量。这样至少书写的时候方便一点。

先介绍三个特殊的预定义的宏变量。

$@ 指代当前的目标名称(target)

$^ 指代当前整个的依赖文件列表(dependencies)

$< 指代当前以来文件列表中的第一项

从上面的叙述看到,可以用一个宏变量来代替一个文件列表。

那么怎么在后面引用这些宏变量呢?是用符号$加上变量名称。

要注意:如果宏变量名称长度超过一个那么就要用圆括号包住$(NAME)。

定义宏变量的格式就是

macro_name = string1 string2 ...

这里string可以是文件名称,也可以是编译器参数等。

好了,现在对刚才的makefile做一些改变

#makefile using macro variants

OBJS = main.o a.o b.o
CC = g++

exam : $(OBJS)
    $(CC) $^ -o $@
main.o : main.cpp a.h b.h
    $(CC) -c $< -o $@
a.o : a.cpp a.h
    $(CC) -c $< -o $@
b.o : b.cpp b.h
    $(CC) -c $< -o $@
#makefile end

基本上这就是很常用的makefile了。

编译完成后,会留下很多.o文件。要清除她们,也可以在makefile中完成。
怎么做呢?
在上面文件的尾部添加如下的命令:

clean :
    rm -f *.o

然后,在运行命令

$ make clean

大功告成。

对最后的一个命令解释一下吧。clean,就是一个目标名称而已,

也可以换成其他的,比如cleanup。

那么运行的这条make clean命令就是让make程序完成指定的目标。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息