9.4 常见的头文件问题
编译时找不到头文件。在程序中这样包含头文件:#include
对于尖括号里的头文件,去哪里找它?
系统目录:就是交叉编译工具链里的某个include目录;
也可以自己指定:编译时用“ -I dir”选项指定。
怎么确定“系统目录”?
执行下面命令确定目录:
echo 'main(){}'| $CC -E -v -
它会列出头文件目录、库目录(LIBRARY_PATH)。
你需要在头文件目录中确定有没有这个文件,或是自己指定头文件目录。
9.5 常见的库文件问题
链接程序时如果有这样的提示:undefined reference to‘xxx’,它表示xxx函数未定义。
那么解决方法有两个:
①去写出这个函数。
②或是使用库函数,那需要在链接时指定库。
怎么指定库?
想链接libabc.so,那链接时加上:-labc。
库在哪里?
◾ 系统目录:就是交叉编译工具链里的某个lib目录。
◾ 也可以自己指定:链接时用“ -L dir”选项指定。
怎么确定“系统目录”?
执行下面命令确定目录:
echo 'main(){}'| $CC -E -v -
它会列出头文件目录、库目录(LIBRARY_PATH),你编译出库文件时,可以把它放入系统库目录。
9.6 Makefile的引入和规则
9.6.1 Makefile规则与示例
参考文档:(您可复制下方链接至浏览器,或扫描二维码查看)
https://www.gnu.org/software/make/manual/make.html
1
为什么需要Makefile
怎么高效地编译程序?想达到什么样的效果?请参考Visual Studio:修改源文件或头文件,只需要重新编译牵涉到的文件,就可以重新生成APP。
2
Makefile其实挺简单
一个简单的Makefile文件包含一系列的“规则”,其样式如下:
目标(target)…: 依赖(prerequiries)…
命令(command)
如果“依赖文件”比“目标文件”更加新,那么执行“命令”来重新生成“目标文件”。
命令被执行的2个条件:依赖文件比目标文件新,或是目标文件还没生成。
3
Makefile的2个函数
第1个函数:$(foreach var,list,text)
简单地说,就是for each var in list, change it to text。
对list中的每一个元素,取出来赋给var,然后把var改为text所描述的形式。
例子:
objs := a.o b.o
dep_files := $(foreach f, $(objs), .$(f).d) // 最终 dep_files := .a.o.d .b.o.d
第2个函数:$(wildcard pattern)
pattern所列出的文件是否存在,把存在的文件都列出来。
例子:
src_files := $( wildcard *.c) // 最终 src_files 中列出了当前目录下的所有.c 文件
4
一步一步完善Makefile
第1个Makefile,简单粗暴,效率低:
test : main.c sub.c sub.h
gcc -o test main.c sub.c
第2个Makefile,效率高,相似规则太多太啰嗦,不支持检测头文件:
test : main.o sub.o
gcc -o test main.o sub.o
main.o : main.c
gcc -c -o main.o main.c
sub.o : sub.c
gcc -c -o sub.o sub.c
clean:
rm *.o test -f
第3个Makefile,效率高,精炼,不支持检测头文件:
test : main.o sub.o
gcc -o test main.o sub.o
%.o : %.c
gcc -c -o $@ $<
clean:
rm *.o test -f
第4个Makefile,效率高,精炼,支持检测头文件(但是需要手工添加头文件规则):
test : main.o sub.o
gcc -o test main.o sub.o
%.o : %.c
gcc -c -o $@ $<
sub.o : sub.h
clean:
rm *.o test -f
第5个Makefile,效率高,精炼,支持自动检测头文件:
objs := main.o sub.o
test : $(objs)
gcc -o test $^
# 需要判断是否存在依赖文件
# .main.o.d .sub.o.d
dep_files := $(foreach f, $(objs), .$(f).d)
dep_files := $(wildcard $(dep_files))
# 把依赖文件包含进来
ifneq ($(dep_files),)
include $(dep_files)
endif
%.o : %.c
gcc -Wp,-MD,.$@.d -c -o $@ $<
clean:
rm *.o test -f
distclean:
rm $(dep_files) *.o test -f
如您在使用瑞萨MCU/MPU产品中有任何问题,可识别下方二维码或复制网址到浏览器中打开,进入瑞萨技术论坛寻找答案或获取在线技术支持。
https://community-ja.renesas.com/zh/forums-groups/mcu-mpu/
未完待续
推荐阅读
TCP编程示例 - RZ MPU工业控制教程连载(18)
基于TCP实现文件传输与UDP编程示例 - RZ MPU工业控制教程连载(19)
WebServer移植 - RZ MPU工业控制教程连载(20)