以前我有一条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)
这部分效果很好。
然后,我想我希望能够添加命令行中给定的可选参数。然后,此选项将进入gcc
我在pictDBM
子部分中执行的命令行。
我通过使用OPTS=""
在代码中声明的变量(在makefile的开头(在任何指令之前))解决了该问题。我的目标是这样叫make :make all OPT='-g'
。
然后我声明了一个变量 base=gcc $(CFLAGS) -o $@ $^ $(LDLIBS)
我的解决方案的一部分是使用if else构造在我在pictDBM中执行${OPT}
的${base}
gcc
命令中包含或不包含我的选项变量。
我修改了这个主题,这有助于构建我的多行代码(如果不是):
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
您只能看到-e打印回波,如何解决此问题?
您不需要条件或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
正确的话,你可以依靠化妆的隐性关联规则,没有处方需要。
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句