makefile的使用方法

Posted Dontla

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了makefile的使用方法相关的知识,希望对你有一定的参考价值。

参考教程视频链接:[教程]Makefile的写法

makefile基本语法格式:

简单示例(单文件)makefile写法

新建文件main.cpp

#include <iostream>

using namespace std;

int main(){
        cout << "success!" << endl;
        return 0;
}

新建文件makefile,跟.cpp文件放一起

main:main.c
	g++ main.c -o main

终端运行

make

结果:

带包含关系的多文件makefile写法(包含1个文件)

yg@ubuntu:~/arnold_test/20210911_makefileTest2$ tree
.
├── main.c
├── makefile
├── tool.c
└── tool.h

main.c

#include "tool.h"
#include <stdio.h>

int main(){
	int arr[] = {1,8,3,4,5};
	int m = find_max(arr,5);
	printf("max = %d\\n",m);
	
	return 0;
}

tool.c

#include "tool.h"

int find_max(int arr[], int n){
	int m = arr[0];
	int i;
	for(i=0; i<n; i++){
		if(arr[i] > m){
			m = arr[i];
		}
	}
	return m;
}

tool.h

#pragma once

extern int find_max(int arr[], int n);

多文件时,写makefile一般从后往前写

makefile

main:main.c tool.o
	gcc main.c tool.o -o main

tool.o:tool.c
	gcc -c tool.c

编译:

yg@ubuntu:~/arnold_test/20210911_makefileTest2$ make
gcc -c tool.c
gcc main.c tool.o -o main
yg@ubuntu:~/arnold_test/20210911_makefileTest2$ 
yg@ubuntu:~/arnold_test/20210911_makefileTest2$ tree
.
├── main
├── main.c
├── makefile
├── tool.c
├── tool.h
└── tool.o

.o是链接文件

在需要发布源码时,编译后删除可执行文件和.o链接文件的makefile指令(make clean)

在后面加上这一句:

clean:
	rm *.o main

makefile

main:main.c tool.o
	gcc main.c tool.o -o main

tool.o:tool.c
	gcc -c tool.c

clean:
	rm *.o main

这样在我们使用make指令编译后,再使用make clean指令,就能将生成的main和tool.o删除

yg@ubuntu:~/arnold_test/20210911_makefileTest2$ make clean
rm *.o main
yg@ubuntu:~/arnold_test/20210911_makefileTest2$ tree
.
├── main.c
├── makefile
├── tool.c
└── tool.h

0 directories, 4 files
yg@ubuntu:~/arnold_test/20210911_makefileTest2$ 

带包含关系的多文件makefile写法(包含>=2个文件)

yg@ubuntu:~/arnold_test/20210911_makefileTest2$ tree
.
├── bar.c
├── bar.h
├── foo.c
├── foo.h
├── main.c
└── makefile

0 directories, 6 files
yg@ubuntu:~/arnold_test/20210911_makefileTest2$ 

main.c

#include "foo.h"
#include "bar.h"
#include <stdio.h>

int main(){
	int arr[] = {1,2,3,4,5};
	printf("min = %d\\n", find_min(arr, 5));
	printf("max = %d\\n", find_max(arr, 5));	
	return 0;
}

bar.c

#include "bar.h"

int find_min(int arr[], int n){
	return 1;
}

foo.c

#include "foo.h"

int find_max(int arr[], int n){
	return 10;
}

bar.h

int find_min(int arr[], int n);

foo.h

int find_max(int arr[], int n);

makefile

main:main.c bar.o foo.o
	gcc main.c bar.o foo.o -o main

bar.o:bar.c
	gcc -c bar.c

foo.o:foo.c
	gcc -c foo.c

clean:
	rm *.o main

运行结果:

yg@ubuntu:~/arnold_test/20210911_makefileTest2$ make
gcc -c bar.c
gcc -c foo.c
gcc main.c bar.o foo.o -o main
yg@ubuntu:~/arnold_test/20210911_makefileTest2$ ls
bar.c  bar.h  bar.o  foo.c  foo.h  foo.o  main  main.c  makefile
yg@ubuntu:~/arnold_test/20210911_makefileTest2$ make clean
rm *.o main
yg@ubuntu:~/arnold_test/20210911_makefileTest2$ 

makefile指定编译器CC(名字自己定)

makefile

CC = gcc

main:main.c bar.o foo.o
	$(CC) main.c bar.o foo.o -o main

bar.o:bar.c
	$(CC) -c bar.c

foo.o:foo.c
	$(CC) -c foo.c

clean:
	rm *.o main

增加自定义参数

多个主函数编译生成多个可执行文件的makefile写法(all指令)


代码略

makefile

CC = gcc

all:main_min main_max

main_min:main_min.c bar.o
	$(CC) main_min.c bar.o -o main_min

main_max:main_max.c foo.o
	$(CC) main_max.c foo.o -o main_max

bar.o:bar.c
	$(CC) -c bar.c

foo.o:foo.c
	$(CC) -c foo.c

clean:
	rm *.o main_min main_max

运行结果:

yg@ubuntu:~/arnold_test/20210911_makefileTest2$ make
gcc -c bar.c
gcc main_min.c bar.o -o main_min
gcc -c foo.c
gcc main_max.c foo.o -o main_max
yg@ubuntu:~/arnold_test/20210911_makefileTest2$ tree
.
├── bar.c
├── bar.h
├── bar.o
├── foo.c
├── foo.h
├── foo.o
├── main_max
├── main_max.c
├── main_min
├── main_min.c
└── makefile

0 directories, 11 files
yg@ubuntu:~/arnold_test/20210911_makefileTest2$ make clean
rm *.o main_min main_max
yg@ubuntu:~/arnold_test/20210911_makefileTest2$ ls
bar.c  bar.h  foo.c  foo.h  main_max.c  main_min.c  makefile
yg@ubuntu:~/arnold_test/20210911_makefileTest2$ 

以上是关于makefile的使用方法的主要内容,如果未能解决你的问题,请参考以下文章

使用带有 NMake 样式 Makefile 的 clang-cl 无法回显

Makefile文件语法

如何使用 makefile 使用 Visual Studio 编译代码

重建后的Makefile重新编译代码需要很多时间

使用makefile动态编译c++代码

使用Makefile编译多个c源代码的方法