makefile CFLAGS忽略$(mysql_config --libs)?

问题描述 投票:0回答:1

我制作了一个玩具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 c makefile
1个回答
1
投票

内容$(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)
© www.soinside.com 2019 - 2024. All rights reserved.