我做了一个玩具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
型
1条答案
按热度按时间6tdlim6h1#
内容
$(mysql_config --libs_r)
旨在要求 shell 调用该命令并将字符串替换为其输出。但是,make 使用
$(...)
语法来扩展变量。因此,您尝试运行shell命令mysql_config --libs_r
实际上被解释为扩展名为mysql_config --libs_r
的make变量,其中没有一个,因此您在这里得到一个空字符串。您需要从make中转义
$(...)
语法,以便将其传递给shell。此外,缩进似乎暗示您希望LDLIBS和CFLAGS都是
all
目标上的目标特定变量,但如果这确实是您想要的,则必须多次写入目标;每行只能有一个目标特定变量赋值。你想要这个:
字符串
这有一些效率问题,因为它将为 * 每个 * 编译和链接操作运行
mysql_config
* 两次 *。更高效的是:型
然后使用make变量
$(mysql_LIBS)
和$(mysql_FLAGS)