1.例子
这个代码中总共有三个,分别是test.h test.cpp main.cpp
main: main.o test.o
g++ main.o test.o -o main
main.o: main.cpp test.h
g++ -c main.cpp
test.o: test.cpp test.h
g++ -c test.cpp
clean:
rm *.o
2.编译过程的理解
(1)main.cpp文件中包含的是test.h文件,而不能够是test.cpp文件,否则会出现重定义的问题
(2)在编译的过程中,各个.cpp文件都要单独编译,假如main.cpp文件中包含test.cpp文件的话.则在main.cpp生成main.obj文件的过程中同时生成了test.obj文件.而test.cpp文件本身也是.cpp文件,所以也要单独编译,最后所有的.obj文件会连接到一起生成.exe文件,这时发现有两个test.obj文件,也就是出现了重定义
3.makefile的编写
(1)基于上面对编译过程的简单理解,makefile的编写就简单多了
main: main.o test.o
g++ main.o test.o -o main
即在这份代码中总共有两个obj文件,分别是main.o 和test.o,最后这两个obj文件连接到一起生成了main(exe文件)
有两个obj文件是因为有两个.cpp文件
(2)
main.o: main.cpp test.h
g++ -c main.cpp
test.o: test.cpp test.h
g++ -c test.cpp
这里是对所有的obj文件进行编写,这里总共有两个obj文件,所以就是对main.o 和 test.o进行编写
main.cpp文件中包含有test.h文件
test.cpp文件中包含有test.h文件
(3)clean
clean:
rm *.o
这个基本都可以这样写
(4)notice:
每一行开头用的应该是tab而不是空格
4.补充
对于重定义的问题,可以通过extern来解决
例子:
a.cpp:
int add(int numa, int numb) {
return numa + numb;
}
b.cpp:
extern int add();
int main() {
int a, b;
cin >> a >> b;
int result = add(a, b);
return 0;
}