最近在写一个项目,由于项目的文件过多,所以就需要将文件进行类进行操作。这样会对代码的维护方便很多。这就需要对代码进行合理的整理,一个好的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

2156d6cf1da04ebf368ef53db680196d.png感谢您的支持

感谢您的支持

Logo

更多推荐