我制作了一个玩具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)
当我运行全部内容时,它只会执行:
cc -g -O2 -Wall -Wextra -Isrc -rdynamic -Isrc asd.c -lm -o asd
所有的MySQL CFLAGS和LDLIBS都放在哪里?还是我的脚本有问题?
当我在shell中键入'mysql_config --cflags'进行演示时,这将返回:
-I/usr/include/mysql
内容$(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 \
CFLAGS += -Isrc $$(mysql_config --cflags)
这存在一些效率问题,因为它将对[[every编译和链接操作运行mysql_config
twice。效率会更高:
mysql_LIBS := $(shell mysql_config --libs_r)
mysql_FLAGS := $(shell mysql_config --cflags)
然后使用make变量$(mysql_LIBS)
和$(mysql_FLAGS)