自己写makefile

本文介绍了如何编写makefile来组织和编译C/C++项目。通过一个实例展示了makefile的基本规则,包括目标依赖、tab符号的使用以及如何编译多个独立文件。文中提到,makefile的执行并不按顺序进行,而是根据依赖关系确定。最后,提到了如何在makefile中添加清理(clean)目标,以便删除编译生成的中间文件。

首先,准备好三个文件: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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值