makefile CFLAGS ignore $(mysql_config --libs)?

j8ag8udp  于 12个月前  发布在  Mysql
关注(0)|答案(1)|浏览(109)

我做了一个玩具makefile的例子来测试mysql,但是makefile不能识别mysql_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 CFLAGS和LDLIBS都到哪里去了?还是我的脚本有问题?
当我在shell中键入'mysql_config --cflags'时,这将返回,用于演示:

-I/usr/include/mysql

6tdlim6h

6tdlim6h1#

内容$(mysql_config --libs_r)旨在要求 shell 调用该命令并将字符串替换为其输出。
但是,make 使用$(...)语法来扩展变量。因此,您尝试运行shell命令mysql_config --libs_r实际上被解释为扩展名为mysql_config --libs_r的make变量,其中没有一个,因此您在这里得到一个空字符串。
您需要从make中转义$(...)语法,以便将其传递给shell。
此外,缩进似乎暗示您希望LDLIBS和CFLAGS都是all目标上的目标特定变量,但如果这确实是您想要的,则必须多次写入目标;每行只能有一个目标特定变量赋值。
你想要这个:

all: LDLIBS += $$(mysql_config --libs_r) -lm
all: CFLAGS += -Isrc $$(mysql_config --cflags)

字符串
这有一些效率问题,因为它将为 * 每个 * 编译和链接操作运行mysql_config * 两次 *。更高效的是:

mysql_LIBS := $(shell mysql_config --libs_r)
mysql_FLAGS := $(shell mysql_config --cflags)


然后使用make变量$(mysql_LIBS)$(mysql_FLAGS)

相关问题