最近在写一个项目,由于项目的文件过多,所以就需要将文件进行类进行操作。这样会对代码的维护方便很多。这就需要对代码进行合理的整理,一个好的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进行编译。
声明:本文为原创,作者为 lijingle,转载时请保留本声明及附带文章链接:https://www.lijl888.com/archives/82
赏
感谢您的支持
感谢您的支持