makefile CFLAGS ignore$(mysql\u config--libs)?
我制作了一个玩具makefile示例来测试mysql,但是makefile无法识别mysql\u config。 这是makefile脚本:makefile CFLAGS ignore$(mysql\u config--libs)?,mysql,c,makefile,Mysql,C,Makefile,我制作了一个玩具makefile示例来测试mysql,但是makefile无法识别mysql\u config。 这是makefile脚本: CFLAGS = -g -O2 -Wall -Wextra -Isrc -rdynamic $(OPTFLAGS) LDLIBS = $(OPTLIBS) SOURCES =$(wildcard *.c) OBJECTS = asd all: LDLIBS += $(mysql_config --libs_r) -lm CFLAGS += -I
CFLAGS = -g -O2 -Wall -Wextra -Isrc -rdynamic $(OPTFLAGS)
LDLIBS = $(OPTLIBS)
SOURCES =$(wildcard *.c)
OBJECTS = asd
all: LDLIBS += $(mysql_config --libs_r) -lm
CFLAGS += -Isrc $(mysql_config --cflags)
all: $(OBJECTS)
当我运行make all时,它只执行:
cc -g -O2 -Wall -Wextra -Isrc -rdynamic -Isrc asd.c -lm -o asd
mysql的CFLAG和LDLIB都到哪里去了?还是我的剧本有问题
当我在shell中键入“mysql\u config--cflags”以进行演示时,会返回:
-I/usr/include/mysql
内容$(mysql\u config--libs\u r)
旨在要求shell调用该命令并用其输出替换字符串
但是,make使用$(…)
语法来扩展变量。因此,您试图运行shell命令mysql\u-config--libs\u-r
实际上被解释为扩展名为mysql\u-config--libs\u-r
的make变量,其中没有一个变量,因此您在这里得到一个空字符串
您需要从make中转义$(…)
语法,以便将其传递给shell
此外,缩进似乎意味着您希望LDLIBS和CFLAGS都是all
目标上的特定于目标的变量,但是如果这确实是您想要的,那么必须在第一行的末尾使用反斜杠。简单地缩进该行不会使其成为前一行的延续
你想要这个:
all: LDLIBS += $$(mysql_config --libs_r) -lm \
CFLAGS += -Isrc $$(mysql_config --cflags)
这存在一些效率问题,因为它会为每个编译和链接操作运行两次mysql\u config
。更有效的方法是:
mysql_LIBS := $(shell mysql_config --libs_r)
mysql_FLAGS := $(shell mysql_config --cflags)
然后使用make变量
$(mysql\u LIBS)
和$(mysql\u标志)
访问符号$(mysql\u config--LIBS\u r)
将不会生成脚本的内容。您可能想编写$(shell mysql\u config--libs\u r)
请不要,也不要建议在配方中使用make的$(shell…
函数(这就是将它添加到这些变量中所做的)。这可能会导致难以理解的问题(虽然在这种情况下不太可能),您刚才不是说您不建议早些时候使用“shell”吗?如果我想,我能把声明改成这样吗?Mysql_lib=$$(Mysql_config--libs)和某种程度上的缩进仍然可以在我的计算机中工作,而不必使用反冲。缩进“有效”,因为您正在设置一个全局变量,在本例中,这可能相当于设置一个特定于目标的变量。例如,这与在没有任何缩进的情况下设置变量完全相同。我说过,不要在配方中使用$(shell…
)。通过使用:=
,当该变量在makefile中定义时,您只需将其展开一次。在这种情况下,您希望使用$(shell…
,以便只运行一次命令。如果您使用的是Mysql\u lib=$$(Mysql\u config--libs)
,这与您之前所做的是相同的,并且每次访问该命令时都会导致该命令一次又一次地运行。对于libs来说,它并不是那么糟糕,因为你为link做了一次,但对于cflags,你会为每次编译都做一次。如果你想看到它的运行,你可以添加一个$(info…
,它会在每次变量展开时打印出一些内容;无论何处,都会运行mysql\u-config
加载项$(运行mysql\u-config的信息)
。Make将在每次扩展变量时显示该字符串(不会干扰Make的运行),您可以看到它发生了多少次。