最近在写一个项目,由于项目的文件过多,所以就需要将文件进行类进行操作。这样会对代码的维护方便很多。这就需要对代码进行合理的整理,一个好的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文件,其中第一部分为文件夹的定义,将所放文件的文件夹定义好,后面可以很好进行使用。
第三部分是编译器的链接选项:即添加库文件,添加头文件,添加编译器,添加各种链接
第四部分为执行部分,执行部分分为目标和依赖,要生成目标文件就要先生成依赖文件,
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 $
#生成动态库文件
$(TARGET) : $(OBJS)
$(CC) -shared -o $@ $(OBJS)
在编译动态库时,-shared 和-fpic 需要进行添加,添加的位置需要注意否则会编译不成功,在顶层的Makefile中,加上一句
@list=’$(SUBDIRS)’;for subdir in $$list; do
cd $$subdir && make;
done
上句查找子文件里的Makefile,然后将子文件夹里的Makefile进行编译。
赏

感谢您的支持
文章知识点与官方知识档案匹配,可进一步学习相关知识CS入门技能树Linux入门初识Linux25046 人正在系统学习中 相关资源:诗词鉴赏大全软件-教育文档类资源-CSDN文库
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!