C/C++Makeflie实例及出现问题总结

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		#编译时候把所有的警告当做错误

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值