C的Make命令
例子,共有三个文件,分别是、
main.c
#include <stdio.h>
#include "hello.h"
int main()
{
hello();
return 0;
}
hello.c
#include "hello.h"
void hello()
{
printf("Hello Makefile\n");
}
hello.h
#include <stdio.h>
void hello();
书写规则一:
/********没有给出main.c等依赖文件是因为Make可以自己推导*******/
object = main.o hello.o\
edit : $(object)
cc -o edit $(object)
main.o : hello.h
hello.o : hello.h
clean :
rm edit $(object)
书写规则二:
object = main.o hello.o\
edit : $(object)
cc -o edit $(object)
main.o : main.c hello.h
cc -c main.c
hello.o : hello.c hello.h
cc -c hello.c
clean :
rm edit $(object)
依然是OK的
问题:
Q1.找不到自定义头文件
ANS:在Linux中,自定义的头文件在引用的时候和windows不一样,
Windows中下面两种方法都是对的
include <自定义.h>
or
#include "自定义.h"
但是Linux中,只能用
#include "自定义.h"
C++的Make命令
依然是三个文件,稍作修改
main.c
#include <iostream>
#include "hello.h"
using namespace std;
int main()
{
hello();
return 0;
}
hello.c
#include "hello.h"
using namespace std;
void hello()
{
cout << "Hello C++ Makefile!" << endl;
}
hello.h
#include <iostream>
void hello();
书写规则:
和上面一样,只是把gcc / cc改成 g++ 就可以了
object = main.o hello.o\
edit : $(object)
g++ -o edit $(object)
main.o : main.c hello.h
g++ -c main.c
hello.o : hello.c hello.h
g++ -c hello.c
clean :
rm edit $(object)
Makefile只是一个工具,不应该是后面裸板学习的核心,只要掌握它的语法核心即可
(1)通配符(patten):%.o
$@:表示目标文件
&<:表示第一个依赖文件
&^:表示所有依赖文件
test:a.o b.o c.o d.o e.o f.o
gcc -o test &^
%.o : %.c
gcc -c -o $@ $<
clean:
rm *.o test
(2)假想目标:.PHONY --》 应用在目录中有clean文件的情况,这个时候会把clean当成目标文件
Makefile [目标名]:如果不跟目标名,默认第一个目标。
如果有目标名,生成可执行文件名为目标名
对于:
---------------------------
test:a.o b.o c.o d.o e.o f.o
gcc -o test &^
%.o : %.c
gcc -c -o $@ $<
clean:
rm *.o test
---------------------------
执行make clean将会报错
所以要使用假想目标,对Makefile进行修改,修改后如下:
--------------------------
test:a.o b.o c.o d.o e.o f.o
gcc -o test &^
%.o : %.c
gcc -c -o $@ $<
clean:
rm *.o test
.PHONY:clean
-------------------------
(3)即时变量、延时变量、export
简单变量(即时变量):
A := xxx #A的值即刻确定,在定义时候就确定了
B = xxx #B的值使用时候才确定
Makefile函数
a.$(foreach var,list,text)
b.$(filter pattern...,text) #在text中取出符合pattern格式的值
$(filter-out pattern,,,.text) #在text中取出不符合pattern格式的值
c.$(wildcard pattern) #pattern定义了文件名的格式
#wildcard取出其中存在的文件
d.$(patsubst pattern,replacemnt,$(var)) #从列表中取出每一个值
#如果符合pattern
#则替换为replacement
Makefile实例
a.改进:支持头文件依赖
gcc -M c.c //打印出依赖
gcc -M -MF c.d c.c //把依赖写入文件c.d
gcc -c -o c.o c.c -MD -MF c.d //编译c.c同时生成依赖文件
b.添加CFLAGS(编译参数)
CFLAGS = -Werror
gcc $(CFLAGS) -c -o $@ $< 0MD -MF .$@.d #编译时候把所有的警告当做错误