自己写makefile
Posted 爱橙子的OK绷
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自己写makefile相关的知识,希望对你有一定的参考价值。
首先,准备好三个文件:file1.h,file1.cpp,file2.cpp。
file1.h代码:
#ifndef FILE1_H_
#define FILE1_H_
#ifdef __cplusplus
extern "C"
#endif
void File1Print();
#ifdef __cplusplus
#endif
#endif
file1.cpp代码:
#include <iostream>
#include "file1.h"
using namespace std;
void File1Print()
cout<<"Print file1**********************"<<endl;
file2.cpp代码:
#include <iostream>
#include "file1.h"
using namespace std;
int main()
cout<<"Print file2**********************"<<endl;
File1Print();
return 0;
makefile文件:makefile不是按照顺序执行的,它只执行第一个目标和第一个目标所依赖的目标,也就是说要把最终的目标文件放在第一行!!!make命令默认只执行第一条命令。
helloworld:file1.o file2.o
g++ file1.o file2.o -o helloworld
file2.o:file2.cpp
g++ -c file2.cpp -o file2.o
file1.o:file1.cpp file1.h
g++ -c file1.cpp -o file1.o
clean:
rm -rf *.o helloworld
由此可见,makefile文件规则为:
A: B
(tab)<command>
(tab)<command>
A: B表示A依赖B,并且每个命令行前都会有一个tab符号。上面makefile的结果就是编译出一个helloworld可执行文件。下面一句句解释:
(1)helloworld依赖file1.o,file2.o两个文件:
helloworld:file1.o file2.o
从而由下面语句编译出helloworld可执行文件,在-o后面指定文件名:
g++ file1.o file2.o -o helloworld
(2)file2.o依赖file2.cpp文件:
file2.o:file2.cpp
从而由下面语句编译出file2.o文件:
g++ -c file2.cpp -o file2.o
(3)同理,下面负责编译出file1.o文件:
file1.o:file1.cpp file1.h
g++ -c file1.cpp -o file1.o
到此,以上三段代码即可以成功编译出helloworld可执行文件。在命令行键入make
命令即可。若要做好清理工作,clean语句就会发挥作用:
(4)删除*.o和helloworld文件
clean:
rm -rf *.o helloworld
命令行输入make clean
即可。
整个执行过程如下图:
若多个要编译的文件之间是独立的,没有依赖关系,如何编写makefile呢?
假如现在有两个文件echo_client.c和echo_server.c,两者的编译过程是独立的,那么如果在makefile中编写如下:
echo_client.o:echo_client.c
gcc -c echo_client.c -o echo_client.o
echo_server.o:echo_server.c
gcc -c echo_server.c -o echo_server.o
则只会执行第一个语句gcc -c echo_client.c -o echo_client.o,第二个语句不会执行。要解决这个问题就需要使用all,完整makefile代码如下:
all:echo_client.o echo_server.o
gcc echo_client.o -o echo_client
gcc echo_server.o -o echo_server
echo_client.o:echo_client.c
gcc -c echo_client.c -o echo_client.o
echo_server.o:echo_server.c
gcc -c echo_server.c -o echo_server.o
clean:
rm -rf *.o echo_client echo_server
以上是关于自己写makefile的主要内容,如果未能解决你的问题,请参考以下文章