以前我有一个指令pictDBM
,它是这样的:
all: pictDBM
pictDBM : db_list.o db_delete.o db_utils.o error.o pictDBM.o
db_create.o dedup.o image_content.o pictDBM_tools.o db_read.o
gcc $(CFLAGS) -o $@ $^ $(LDLIBS)
这部分效果很好。
然后我想我希望能够添加一个从命令行给出的可选参数。然后,该选项将进入我在pictDBM
子部分中执行的gcc
命令行。
我通过使用我在代码中声明的OPTS=""
变量(在任何指令之前的makefile的开头)来解决这个问题。我的目标是这样称呼make:make all OPT='-g'
。
然后我声明了一个变量base=gcc $(CFLAGS) -o $@ $^ $(LDLIBS)
我的部分解决方案是使用if-else构造将我的选项变量${OPT}
包含或不包含在我在pictDBM中执行的${base}
gcc
命令中。
我红了这个主题,这有助于构建我的多行if else结构:
pictDBM : db_list.o db_delete.o db_utils.o error.o pictDBM.o
db_create.o dedup.o image_content.o pictDBM_tools.o db_read.o
if [ ! -z "$$OPT" ];
then
echo "$$base $$OPT" ; #for debugging purposes
eval "$$base $$OPT" ;
else
eval "$$base" ;
fi ;
当我简单地执行make all
时,make似乎一切都正常,并且输出程序运行良好。
但当我执行make all OPTS='-g'
时,我得到以下输出:
-g
/bin/sh: 1: eval: -g: not found
makefile:16: recipe for target 'pictDBM' failed
make: *** [pictDBM] Error 127
你只能看到回声打印-g,我该怎么解决这个问题?
您不需要条件或eval
,只需直接在命令行上指定CFLAGS
即可:
make all CFLAGS=-g
并覆盖makefile中的变量:
override CFLAGS += # Your local options
all: pictDBM
pictDBM: db_list.o db_delete.o db_utils.o error.o pictDBM.o
db_create.o dedup.o image_content.o pictDBM_tools.o db_read.o
gcc $(CFLAGS) -o $@ $^ $(LDLIBS)
CFLAGS
在这里有点奇怪,但是,您不应该在链接期间传递编译标志。
链接选项可以用LDFLAGS
指定;由于pictDBM
以pictDBM.o
为先决条件,并且您已经正确使用了LDLIBS
,因此您可以依赖make的隐式链接规则,无需配方。
override LDFLAGS += # Your local options
pictDBM: db_list.o db_delete.o db_utils.o error.o pictDBM.o
db_create.o dedup.o image_content.o pictDBM_tools.o db_read.o
关于您的评论,您需要在变量的第一个定义上指定override
,否则它将不起作用:
override CFLAGS += $(shell pkg-config vips --cflags) -std=c99 -Wall
override LDLIBS += $(shell pkg-config vips --libs) -lm -lssl -lcrypto
pictDBM: db_list.o db_delete.o db_utils.o error.o pictDBM.o db_create.o dedup.o image_content.o pictDBM_tools.o db_read.o