自己写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的主要内容,如果未能解决你的问题,请参考以下文章

自己写makefile

自己写makefile

linux下make的使用,写一个自己的Makefile

跟我一起写 Makefile

如何自己编写Makefile

自己动手写一个操作系统——loader