为公司的pcie接⼝FPGA板卡编写上位机软件——Makefile解
公司购买了某公司的⼀块FPGA的板卡,想给这个板卡发送图⽚,然后得到返回的坐标,再往图⽚上框出识别到的物体。
驱动已经由供应商给出,编译安装正常,板卡端的软件由同事烧写,所以我的任务是写⼀个应⽤软件,给板卡发送数据并读取处理结果。
参考例程为供应商给出的例程2.
主机平台为龙芯,mips64架构
⾸先看Makefile——这也是⾃⼰⼀直想掌握却没有掌握的知识点
从头部的注释中知道,这个makefile会搜索指定⽬录下所有的c/c++源⽂件并进⾏编译和链接。除了可以编译使⽤标准的c/c++库的程序之外,使⽤者还可以添加其他库,即定制化。
使⽤的是gnu make,如果是其它版本的make则可能⽆法⼯作。
使⽤⽅法:
1、将Makefile拷贝到指定⽬录
2、定制化。
修改第⼀部分的makefile即可,包含编译选项MY_CFLAGS和MY_LIBS,可以看到,这⾥没有使⽤特殊的编译选项,但是添加了数学库和线程库MY_LIBS  = $(LIBS) ——LIBS = -lm -lpthread
修改源码⽬录,此处为src⽂件夹
定义程序的名称,此处为pcie_image_trd
3、执⾏make即可启动编译。
make的⽬标:
make:编译和链接
make NODEP=yes:编译和链接但是不产⽣依赖⽂件
make objs:只编译不链接
make tags:
make ctags:                  //这两个应该是配合⼀些ide使⽤的
make clean:清除⼯程和可执⾏⽂件
make distclean:清除⼯程⽂件、可执⾏⽂件和依赖⽂件
make help:查看帮助
进⼊到Makefile正⽂:
1、设置环境
MY_CFLAGS =                                      //未添加⾃定义的编译选项
LIBS = -lm -lpthread                              //指定链接数学库和线程库
MY_LIBS  = $(LIBS)
CPPFLAGS  = -Wall                              //打开警告信息
LDFLAGS  =                                          //链接选项未设置
SRCDIRS += ./src                                  //指定源⽂件路径
PROGRAM  = pcie_image_trd              //指定名称
2、默认的选项
SRCEXTS = .c .C .cc .cpp .CPP .c++ .cxx .cp                          //源⽂件的扩展名类型
makefile phony
HDREXTS = .h .H .hh .hpp .HPP .h++ .hxx .hp                        //头⽂件的扩展名类型
INCLUDES =  -I ./src                                                                  //指定头⽂件的保存路径
COMPILE_OPTS = -g $(INCLUDES)                                        //指定c编译选项,可以看到,添加了调试信息
CXXFLAGS= $(COMPILE_OPTS)  -DBSD=1                            //指定c++编译选项,可以看到,添加了调试信息并且定义了⼀个宏BSD
CC    = gcc
CXX    = g++                                                                              //指定c和c++编译器
ETAGS = etags
ETAGSFLAGS =
CTAGS = ctags
CTAGSFLAGS =                                                                        //这两个变量应该是为其他的代码阅读器⽣成⼀些⼯程⽂件3、固定的部分
SHELL  = /bin/sh                                          //指定shell
EMPTY  =
SPACE  = $(EMPTY) $(EMPTY)                //定义空格,为之后规范化名称使⽤
ifeq ($(PROGRAM),)                                    //如果没有定义⼯程名称,则使⽤当前路径信息
CUR_PATH_NAMES = $(subst /,$(SPACE),$(subst $(SPACE),_,$(CURDIR)))  //定义当前路径名字为:先获得当前路径/home/loongson/FPGA/pcie_image_trd,并使⽤下划线替换空格,然后使⽤空格
替换反斜杠\最后得到CUR_PATH_NAMES =  home loongson FPGA pcie_image_trd
PROGRAM = $(word $(words $(CUR_PATH_NAMES)),$(CUR_PATH_NAMES))//指定⼯程名字为路径中最后⼀个单词  ifeq ($(PROGRAM),)                                  //如果这时⼯程名还是空,那么应该是位于根⽬录下或者⽐较怪异的⽬录下,使⽤
a.out
PROGRAM = a.out
endif
endif
ifeq ($(SRCDIRS),)                                      //如果没有定义源⽂件路径,则默认为当前路径
SRCDIRS = .
endif
SOURCES = $(foreach d,$(SRCDIRS),$(wildcard $(addprefix $(d)/*,$(SRCEXTS))))//这⾥没理解add
prefix的作⽤,d为空,也就是获取了所有的源⽂件扩展类型,然后罗列出来,再对源⽂件路径挨个进⾏查
HEADERS = $(foreach d,$(SRCDIRS),$(wildcard $(addprefix $(d)/*,$(HDREXTS))))//同上
SRC_CXX = $(filter-out %.c,$(SOURCES))          //去掉所有.c的⽂件即可得到c++的源⽂件,其他后缀的⽂件均被视为c++⽂件OBJS    = $(addsuffix .o, $(basename $(SOURCES)))  //顾名思义,定义⽬标⽂件为.o⽂件
DEPS    = $(OBJS:.o=.d)                                          //依赖⽂件
4、定义⼀些有⽤的变量
DEP_OPT = $(shell if `$(CC) --version | grep "GCC" >/dev/null`; then \
echo "-MM -MP"; else echo "-M"; fi )
DEPEND      = $(CC)  $(DEP_OPT)  $(MY_CFLAGS) $(CFLAGS) $(CPPFLAGS)
DEPEND.d    = $(subst -g ,,$(DEPEND))
COMPILE.c  = $(CC)  $(MY_CFLAGS) $(CFLAGS)  $(CPPFLAGS) -c
< = $(CXX) $(MY_CFLAGS) $(CXXFLAGS) $(CPPFLAGS) -c
LINK.c      = $(CC)  $(MY_CFLAGS) $(CFLAGS)  $(CPPFLAGS) $(LDFLAGS)
<    = $(CXX) $(MY_CFLAGS) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS)
.PHONY: all objs tags ctags clean distclean help show
5、⽣成依赖⽂件
%.d:%.c
@echo -n $(dir $<) > $@
@$(DEPEND.d) $< >> $@
%.d:%.C
@echo -n $(dir $<) > $@
@$(DEPEND.d) $< >> $@
%.d:%.cc
@echo -n $(dir $<) > $@
@$(DEPEND.d) $< >> $@
%.d:%.cpp
@echo -n $(dir $<) > $@
@$(DEPEND.d) $< >> $@
%.d:%.CPP
@echo -n $(dir $<) > $@
@$(DEPEND.d) $< >> $@
%.d:%.c++
@echo -n $(dir $<) > $@
@$(DEPEND.d) $< >> $@
%.d:%.cp
@echo -n $(dir $<) > $@
@$(DEPEND.d) $< >> $@
%.d:%.cxx
@echo -n $(dir $<) > $@
@$(DEPEND.d) $< >> $@ 6、⽣成.o⽂件
objs:$(OBJS)
%.o:%.c
$(COMPILE.c) $< -o $@
%.o:%.C
$() $< -o $@
%.o:%.cc
$() $< -o $@
%.o:%.cpp
$() $< -o $@
%.o:%.CPP
$() $< -o $@
%.o:%.c++
$() $< -o $@
%.o:%.cp
$() $< -o $@
%.o:%.cxx
$() $< -o $@
7、⽣成tag⽂件
tags: $(HEADERS) $(SOURCES)
$(ETAGS) $(ETAGSFLAGS) $(HEADERS) $(SOURCES)
ctags: $(HEADERS) $(SOURCES)
$(CTAGS) $(CTAGSFLAGS) $(HEADERS) $(SOURCES)
8、⽣成可执⾏⽂件
$(PROGRAM):$(OBJS)                                                      //依赖为.o⽂件
ifeq ($(SRC_CXX),)              # C program                              //如果是c⼯程,在本例中源⽂件为3个c⽂件    $(LINK.c)  $(OBJS) $(MY_LIBS) -o $@
@echo Type ./$@ to execute the program.
else                            # C++ program                                    //如果是c++⼯程
$() $(OBJS) $(MY_LIBS) -o $@
@echo Compile complete !
#    @echo Type ./$@ to execute the program.
endif
ifndef NODEP
ifneq ($(DEPS),)
sinclude $(DEPS)                                                  //不到需要的⽂件,也不报错,继续执⾏
endif
endif
>>>>>>>>>>>>>>>##

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。

发表评论