我试图通过shell脚本使用gnu make(4.1)构建一些c程序。我想使用不同的CFLAGS参数,我从文件中读取这些参数。该文件包含以下行:
"-O1 -freorder-functions"
我正在尝试做类似
的事情while read line
do
opts="$line"
make CFLAGS="$opts"
done < $1
但我的所有尝试都会出现以下错误:
cc1: error: argument to ‘-O’ should be a non-negative integer, ‘g’, ‘s’ or ‘fast’
所以我尝试将文件的内容更改为-O1(-freorder-functions)之后的参数,并在shell脚本中添加-O1:
opts=$(printf "\"-O%d %s\"", 1, "$line")
(以及许多其他似乎不太合理的事情)但我仍然得到相同的错误信息。
在shell脚本中对要生成的参数进行硬编码工作正常:
make CFLAGS="-O1 -freorder-functions"
很抱歉,如果这是一个愚蠢的问题,但我似乎无法找到这样的事情的例子,而且我是shell脚本的新手,所以我真的不是了解它如何在这里处理变量。我试图传递给CFLAGS的回声看起来不错。
答案 0 :(得分:2)
如果文件中的标记周围有双引号,并且您正确地引用了shell变量,则make
调用最终会被
make CFLAGS="\"-O1 -freorder-functions\""
也就是说,标志中有双引号。这一直传递给编译器调用,这意味着编译器调用类似于
cc "-O1 -freorder-functions" -c foo.c
...要求编译器使用优化级别1 -freorder-functions
,并且它抱怨这是无效的。
要解决此问题,我会从文件中删除引号。您也可以opts=$line
使用$line
不加引号,但这并不完全安全。