makefile的使用方法
Posted Dontla
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 无法回显