关于makefile中的vpath

通过makefile的特殊环境变量vpath设置查找文件路径

Posted by VK on January 8, 2020

vpath的简介和使用

搜Makefile文件中的特殊变量“vpath”就是完成这个功能的,如果没有指明这个变量,make只会在当前的目录中去找寻依赖文件和目标文件。如果定义了这个变量,那么,make就会在当前目录找不到的情况下,到所指定的目录中去找寻文件了。

1、vpath

​ 为符合模式的文件指定搜索目录

​ 2、vpath

​ 清除符合模式的文件的搜索目录。

​ 3、vpath

​ 清除所有已被设置好了的文件搜索目录。

vpath %.h ../headers

vpath错误案例

我在Makefile目录里面建立了一个ss的目录,在此目录里面放了个a.c文件 后在makefile里面这样写到 vpath %.c ss

VPATH=ss

cc=arm-linux-gcc

a:a.c ​ $(cc) -o a a.c

clean: ​ -rm a .o *~ 最后在命令行make,出现 arm-linux-gcc -o a -c a.c arm-none-linux-gnueabi-gcc: a.c: No such file or directory make: ** [a] Error 1

提示找不到目录或者文件,这个要怎么解决呢? 我用vpath制定了c文件在的目录,怎么还是找不到文件呢?

原因:vpath只能告诉make去哪里找文件,你写编译命令行的时候用的是$(cc) -o a a.c ,这就强制gcc在当前目录找当然找不到了。把命令行里面的a.c改成$^就ok了

clean		:		
		rm -f *.o
		rm -f cron crontab
		#makefile里面执行shell命令的话,需要在命令前加上'$(shell 实际shell命令)',如下所示
        $(shell ln -s ../../../../FAW-VW-CRS3.0-37W-Soc/FAW-VW-CRS3.0-37W-System-Sdk/sysroots/armv7ahf-neon-linux-gnueabi/usr/lib/crtn.o)
        $(shell ln -s ../../../../FAW-VW-CRS3.0-37W-Soc/FAW-VW-CRS3.0-37W-System-Sdk/sysroots/armv7ahf-neon-linux-gnueabi/usr/lib/crti.o)
        $(shell ln -s ../../../../FAW-VW-CRS3.0-37W-Soc/FAW-VW-CRS3.0-37W-System-Sdk/sysroots/armv7ahf-neon-linux-gnueabi/usr/lib/crt1.o )

Makefile中LDFLAGS指的是链接库的路径

LDFLAGS= -L../../../FAW-VW-CRS3.0-MQB-System-Sdk/sysroots/armv7ahf-neon-linux-gnueabi/usr/lib