为公司的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 phonyHDREXTS = .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小时内删除。
Linux下的CC++混合编译
« 上一篇
Makefile:如何写目标依赖
下一篇 »
发表评论