linux中Makefile的使用

本文详细介绍了如何使用Makefile进行项目构建和库文件编译,包括目录结构设置、源文件查找、编译参数配置及执行部分详解。通过具体实例,展示了Makefile在实际项目中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在写一个项目,由于项目的文件过多,所以就需要将文件进行类进行操作。这样会对代码的维护方便很多。这就需要对代码进行合理的整理,一个好的Makefile文件是很有帮助。由于学的不久,下面写的如果异议请指正。

Makefile编写

我将项目新建几个文件夹其中包括:include lib Src bin build 五个文件夹,其中include是将程序需要的头文件,lib是程序需要的库文件,src是程序的源码,bin是程序编译出来的可执行文件,Build是Makefile的文件放置处。

######################################
DIR_INC = $(shell pwd)/../Include
DIR_SRC = $(shell pwd)/../Src
DIR_BIN = $(shell pwd)/../Bin
DIR_LIB = $(shell pwd)/../Lib
DIR_BUI = $(shell pwd)/../Build
######################################
#source file
#源文件,自动找所有.c和.cpp文件,并将目标定义为同名.o文件
SRC  := $(wildcard ${DIR_SRC}/*.c) $(wildcard ${DIR_SRC}/*.cpp)
OBJS := $(patsubst %.c,${DIR_OBJ}/%.o,$(patsubst %.cpp,%.o,${SRC}))

#target you can change test to what you want
#目标文件名,输入任意你想要的执行文件名
TARGET  := SDK
 
#compile and lib parameter
#编译参数
CC      := g++
LIBS    := $(shell pkg-config --libs opencv)  -L$(DIR_LIB)/ -limgutils
LDFLAGS :=
DEFINES :=
INCLUDE := $(shell pkg-config --cflags opencv) -I${DIR_INC}/
CFLAGS  := -std=gnu++11 $(DEFINES) $(INCLUDE)
CXXFLAGS:= $(CFLAGS) 
    
#you should not do anything here
.PHONY : everything objs clean veryclean rebuild  
everything : $(TARGET)
all : $(TARGET) 
objs : $(OBJS) 
rebuild: veryclean everything
                
clean :
	rm -fr $(DIR_SRC)/*.so
	rm -fr $(DIR_SRC)/*.o
    
veryclean : clean
	rm -fr $(TARGET)
 
$(TARGET) : $(OBJS)
	$(CC) $(CXXFLAGS) -o $@ $(OBJS) $(LDFLAGS) $(LIBS)

上面为整个Makefile文件,其中第一部分为文件夹的定义,将所放文件的文件夹定义好,后面可以很好进行使用。

第二部是查找源文件和将原文件变成.c文件。wildcard是扩展统配符,本文是将所有.c文件取出来,patsubst是替换的意思,是将所有取出来的.c文件转化为.o文件。

第三部分是编译器的链接选项:即添加库文件,添加头文件,添加编译器,添加各种链接

第四部分为执行部分,执行部分分为目标和依赖,要生成目标文件就要先生成依赖文件,

target ... : prerequisites ...    
 command     
 ...     
 ...

上面为Makefile的基本用法,目标依赖命令。上面是Makefile的一些基本用法,如果想知道更加详细请查阅资料

库文件编译

下面为编译库文件时所需要的Makefile文件

######################################
DIR_INC = $(shell pwd)/../../Include
DIR_LIB = $(shell pwd)/../../Lib
DIR_OBJ = $(PWD)/../../Obj
######################################

#target you can change test to what you want
#共享库文件名,lib*.so
TARGET  := $(DIR_LIB)/libdoorimgadd.so

#compile and lib parameter
#编译参数
CC      := g++
LIBS    := $(shell pkg-config --libs opencv) 
LDFLAGS :=
DEFINES :=
INCLUDE := $(shell pkg-config --cflags opencv) -I$(DIR_INC)/
CFLAGS  := -g -Wall -O3 -std=gnu++11 $(DEFINES) $(INCLUDE) 
CXXFLAGS:= $(CFLAGS) 

#source file
#源文件,自动找所有.c和.cpp文件,并将目标定义为同名.o文件
SOURCE  := $(wildcard *.c) $(wildcard *.cpp)
OBJS    := $(addprefix $(DIR_OBJ)/,$(patsubst %.cpp,%.o,$(SOURCE)))

.PHONY : everything objs clean veryclean rebuild
all : $(TARGET)

clean :
	rm -fr *.o
 
veryclean : clean
	rm -fr $(TARGET)

# 生成.o文件 
$(DIR_OBJ)/%.o : %.cpp
	$(CC) $(CXXFLAGS) -fpic -c $< -o $@ $(LIBS)

#生成动态库文件
$(TARGET) : $(OBJS)
	$(CC) -shared -o $@ $(OBJS)

在编译动态库时,-shared 和-fpic 需要进行添加,添加的位置需要注意否则会编译不成功,在顶层的Makefile中,加上一句

@list='$(SUBDIRS)';for subdir in $$list; do \
		cd $$subdir && make; \
	done

上句查找子文件里的Makefile,然后将子文件夹里的Makefile进行编译。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值