Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
makefile CFLAGS ignore$(mysql\u config--libs)?_Mysql_C_Makefile - Fatal编程技术网

makefile CFLAGS ignore$(mysql\u config--libs)?

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

我制作了一个玩具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 += -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的运行),您可以看到它发生了多少次。