Linux下makefile分析与编写

之前写过一篇关于makefile的博客,是关于几个源文件与头文件的编写,所有的文件都加在上面,比如通过依赖文件生成目标文件,都是一个文件一个文件的加在上面,很不凡便,如果又添加好多的源文件需要生成o文件,还需要继续扩大原来的makefile文件,因此这次编写一个较为高效的版本

首先自己编写要先学习别人是如何编写的,下面分析一个案例,案例仅供分析并不放出最后的执行结果

CROSS_COMPILE = aarch64-himix100-linux_V630-
CC = $(CROSS_COMPILE)gcc
CPLUS = $(CROSS_COMPILE)g++

INC_DIR = -I./alg_test/inc
CFLAGS = -Wall $(INC_DIR) -O2 -g -Wall -Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable 
CFLAGS += -mcpu=cortex-a73.cortex-a53 -fno-aggressive-loop-optimizations -lstdc++ -ldl -ffunction-sections -fdata-sections -ftree-vectorize 


SOURCES = $(wildcard ./alg_test/src/*.c)
OBJECTS = $(patsubst %.c, %.o, $(SOURCES))
SOURCES_CPP = $(wildcard ./alg_test/src/*.cpp)
OBJECTS_CPP = $(patsubst %.cpp, %.o, $(SOURCES_CPP))

TARGET = arm_alg

all : $(TARGET)

%.o:%.cpp  
	$(CPLUS) $(CFLAGS) -c -o $@ $<
%.o: %.c
	$(CC) $(CFLAGS) -c -o $@ $<


$(TARGET): $(OBJECTS) $(OBJECTS_CPP)

	$(CC) $(CFLAGS) -o $@ $(OBJECTS) $(OBJECTS_CPP) -lpthread -lm 
	chmod -R 777 $(TARGET)
	rm -f *.o
	mv arm_alg ./bin

clean:

	rm -rf $@.
	rm ./*.o $(TARGER) $(OBJECTS) $(OBJECTS_CPP) -f

直接可能看的不大明白因为里面用到的参数是比较多的下面具体分析。

该makefile文件是让交叉编译工具去编译一个程序,等好的左边都是定义的变量,如CROSS_COMPILE等等,$后面相当于当做参数传递,前三行相当于把编译工具确定,如果是c文件就在后面加上gcc,如果是cpp文件就在后面加上g++,然后和前面的交叉编译前缀连在一起构成完整的交叉编译工具名称。

其后三行INC_DIR与CFLAGS是负责确定编译的配置参数,后面是放在编译工具之后,可以理解为放在gcc之后的参数,这里是放在交叉编译工具之后

-I(大写的i)加上路径表示头文件路径,告诉编译器到这里寻找头文件

-Wall表示编译之后显示所有警告

-O2表示编译优化等级为2级,0-3可选择

-g表示可执行程序包含调试信息

-Wunused-but-set-variable
每当一个局部变量被分配时发出警告,此警告由启用-Wall 。
-Wunused-function
每当声明静态函数但未定义或未使用非内联静态函数时发出警告。此警告由启用-Wall 

-mpcu=type表示处理器类型,这里是交叉编译所以要明确,如果不需要交叉编译可省略

-fno-aggressive-loop-optimizations表示无需优化的循环结构

-l(小写的l)加上动态库,如-lm 链接数学库, -lptread 链接线程库,当然也可以链接自己编译的库,不过需要放到指定寻找的路径下

再其后的四行时批量操作c文件生成o文件 这里就体现出makefile的方便之处

这里用到了makefile中的两个函数wildcard和patsubst

wildcard表示扩展通配符,patsubst表示将路径中所有的c文件以列表形式转换为o文件

SOURCES = $(wildcard ./alg_test/src/*.c)
OBJECTS = $(patsubst %.c, %.o, $(SOURCES))

以上两句就是说将当前文件夹下的c文件以绝对路径保存到sources中,接着将该路径传递到下句所有的c文件生成o文件,但这里并不是真正生成了o文件,而是生成列表,就是说生成一种对应关系,比如a.c对应a.o,b.c对应b.o

以上是所有的准备工作,下面才是具体的指令部分

Target表示最终生成可执行文件,叫做arm_alg

all:表示执行make指令后从该句执行

%.o: %.c
    $(CC) $(CFLAGS) -c -o $@ $<

这两句是生成o文件的指令,%.o和%.c则是上述通配符函数生成的自动对应列表,$@表示目标文件,$<表示依赖文件

以上是一个完整的makefile文件的分析,下面自己动手写一个简单的程序测试一下

新建一个testmakefile,在该文件夹下新建alg文件夹,bin文件夹,makefile文件,alg下新建src,inc两个文件夹,在src中建立a.cpp,b.cp和main.cpp,inc中建立a.h和b.h,两个cpp子文件中分别写函数func1和func2用来打印输出

最后的makefile如下所示,由于程序相当的简单,根本用不到严格的参数配置,我们就简单的添加几个表示一下

CROSS_COMPILER=g
CC=$(CROSS_COMPILER)cc
CXX=$(CROSS_COMPILER)++

INC_DIR=-I ./alg/inc

CFLAGS=-Wall $(INC_DIR) -O1 -g 

SOURCES_C=$(wildcard ./alg/src/*.c)
OBJECTS_C=$(patsubst %.c,%.o,$(SOURCES_C))
SOURCES_CPP=$(wildcard ./alg/src/*.cpp)
OBJECTS_CPP=$(patsubst %.cpp,%.o,$(SOURCES_CPP))

%.o:%.c
	$(CC) $(CFLAGS) -c -o $@ $<
%.o:%.cpp
	$(CXX) $(CFLAGS) -c -o $@ $<

Target=test_alg

all:$(Target)

$(Target): $(OBJECTS) $(OBJECTS_CPP)
	$(CXX) $(CFLAGS) -o $@ $(OBJECTS_C) $(OBJECTS_CPP)
	chmod -R 777 $(Target)
	mv test_alg ./bin

clean:
	rm ./bin/test_alg $(TARGER) $(OBJECTS) $(OBJECTS_CPP)

执行的结果如下所示

 

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值