gpt4 book ai didi

c - Makefile 'ifeq'/'findstring' 看似不正确的字符串比较行为

转载 作者:行者123 更新时间:2023-11-30 18:41:23 31 4
gpt4 key购买 nike

我有几个与此类似的 makefile 变量定义...

BUILD_DIR = build

APP_SRCS = \
./main.c \
./module1.c \
./module2.c \
etc. \

APP_OBJS = $(addprefix $(BUILD_DIR)/, $(notdir $(APP_SRCS:.c=.o)))

...以及与此类似定义的规则...

$(BUILD_DIR)/%.o: %.c
echo "---"$@"---" "---"$(findstring $@, $(APP_OBJS))"---"
ifeq ($(findstring $@, $(APP_OBJS)), $@)
echo "---App---"
else
echo "---Lib---"
endif

执行此规则时,if block 始终被执行。例如,考虑以下终端输出:

---build/main.o--- ---build/main.o---
---App---

---build/lib1.o--- ------
---App---

在这两种情况下,findstring 都能正常工作。我遇到的问题是,是否在字符串中找到子字符串,即 $@ 是否在 $(APP_OBJS) 中找到,if block 始终被采用。我想使用这样的构造来编译具有不同警告标志的应用程序和库源文件,以消除所有库警告。

最佳答案

此声明:

ifeq ($(findstring $@, $(APP_OBJS)), $@)

是一个 Make 条件,Make 将在执行任何规则之前进行评估,因此在自动变量 $@ 具有值之前进行评估。所以 Make 将“$@”扩展为空:

ifeq ($(findstring , $(APP_OBJS)),)

findstring 返回空列表,因为它没有找到匹配项:

ifeq (,)

并且条件评估为真。

您已经有了一个解决方案:使用 shell 条件。或者您可以使用 static pattern rule :

$(APP_OBJS): $(BUILD_DIR)/%.o: %.c
echo "---"$@"---" "---"$@"---"
echo "---App---"

$(BUILD_DIR)/%.o: %.c
echo "---"$@"---" "---""---"
echo "---Lib---"

关于c - Makefile 'ifeq'/'findstring' 看似不正确的字符串比较行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21999269/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com