我有一个在Windows和Linux上运行的应用程序。 它有一个在运行时生成的make文件。 现在的问题是make文件指向文件夹路径,它有@#$%等特殊字符!作为一些道路。
但是因为这些人物有不同的含义 例如,$搜索其定义 #参考评论
编译失败。
你对此有什么决议吗? 提前致谢
答案 0 :(得分:0)
在数字前面使用反斜杠,所以在它们之前使用\,如下所示:\#
答案 1 :(得分:0)
如果要在 Makefile 中生成文字文件名:
# This won't work
OBJECTS := D:/PR/9354/lib_15_#$@%&/submodels/win32-gcc/CONS00_ABHI_REV15.o
$(info [${OBJECTS}])
AFAICS您必须在 make 中处理的唯一特殊字符是$
和#
。
$
总是引入宏扩展。
解决办法是将所有美元加倍:
$$
扩展为名为$
的变量值$
。
#
发表评论。
替换为\#
。
# This works
OBJECTS := D:/PR/9354/lib_15_\#$$@%&/submodels/win32-gcc/CONS00_ABHI_REV15.o
$(info [${OBJECTS}])
如果您从调用$(wildcard ...)
获取文件名,请说
你不必担心上述情况。
但是,你的shell肯定会被所有这些字符搞糊涂。
例如,$
导致 bash 上的参数扩展,&
在 bash 等后台运行命令。
这里最安全的做法是在调用shell之前引用所有文件名。
如果您的shell是 bash ,则使用单引号'
包围每个文件名。
如果您使用的是Windows shell( cmd ),则必须使用双引号。
(如果您使用 cmd ,由于其疯狂的引用规则,您的生活将是地狱。)
所以,假设 bash
$ cat Makefile
OBJECTS := D:/PR/9354/lib_15_\#$$@%&/submodels/win32-gcc/CONS00_ABHI_REV15.o
QUOTED := $(patsubst %,'%',${OBJECTS})
.PHONY: all
all:
echo ${QUOTED}
给
$ make --warn
echo 'D:/PR/9354/lib_15_#$@%&/submodels/win32-gcc/CONS00_ABHI_REV15.o'
D:/PR/9354/lib_15_#$@%&/submodels/win32-gcc/CONS00_ABHI_REV15.o
啧。
最简单的方法当然是避免使用 make 的解析器,
并使用$(file …)
简单地阅读未经检验的文件名。
$ cat names
D:/PR/9354/lib_15_#$@%&/submodels:=/win32-gcc/CONS00_ABHI_REV15.o
$ cat Makefile
OBJECTS := $(file < names)
.PHONY: all
all:
echo $(patsubst %,'%',${OBJECTS})
$ make
echo 'D:/PR/9354/lib_15_#$@%&/submodels:=/win32-gcc/CONS00_ABHI_REV15.o'
D:/PR/9354/lib_15_#$@%&/submodels:=/win32-gcc/CONS00_ABHI_REV15.o
@Vroomfondel指出,该名称甚至包括有问题的:=
。
答案 2 :(得分:0)
一旦make在其特殊含义是允许的解析解决方案的行中找到像#
或:
或$
这样的文字字符,它就会解释它们。你最好的办法是修改makefile的生成器,并重写路径名的输出过滤器,将所有这些字符替换为&#34; defused&#34;引用序列。避免这种情况的另一种方法是预处理makefile并替换有问题的外观,但我认为这比更改文件名输出要困难得多。
在任何情况下,您需要在makefile中使用一些额外的变量定义作为引用结构:
space := $(strip) $(strip)#
comma := ,#
hash := \##
percent := %#
colon := :#
equal := =#
paropen := (#
parclose := )#
像往常一样,{p> $
被$$
转义。这可以让你现在定义各种令人讨厌的字符串:
evilstring := $(space)D$(colon)/PR/9354/lib_15_$(hash)$$@$(percent)&/etc...
虽然其他答案是正确的,但在变量分配中只需要转义$
和#
,我不知道您的生成器是否会在其他位置插入文件名:
类似
D:\home\myfile.o:
或
\home\lib_1_&=@!\myfile.o:
因为目标名称可能会导致问题。
你可能想看看现在甚至有全局匹配的gmtt(例如$(call glob-match,$(shell uname -sr),Linux 4.[7-9].*)
),尽管这可能对你的问题没有帮助。