gpt4 book ai didi

c - makefile 中的变量,意外行为

转载 作者:太空狗 更新时间:2023-10-29 16:06:07 25 4
gpt4 key购买 nike

我在 makefile 中发现了一些奇怪的东西。

在标记为<------ 的行上,如果我把 $(OBJECTS)而不是 String.o编译失败。但是我定义了OBJECTS=$(String.o) ,为什么会这样?

LIBS=-ldl $(OPTLIBS)
PREFIX?=string-automaton/
DESTDIR=/home/jenia/learn-c-the-hard-way/lib2/
CFLAGS=-g -O2 -Wall -Wextra -rdynamic -DNDEBUG -Llibstrl


OBJECTS=$(String.o)

TARGET=build/lib_String.a
SO_TARGET=$(patsubst %.a,%.so,$(TARGET))

# The Target Build
all: build $(TARGET) $(SO_TARGET)

$(TARGET): CFLAGS += -fPIC
$(TARGET): $(OBJECTS)
ar rcs $@ $(OBJECTS)
ranlib $@

$(SO_TARGET): $(TARGET) $(OBJECTS)
$(CC) -shared -o $@ String.o # <----------- $(OBJECTS) woud fail

build:
@mkdir -p build
@mkdir -p bin

clean:
rm -rf build $(OBJECTS) $(TESTS)
rm -f tests/tests.log
find . -name "*.gc*" -exec rm {} \;
rm -rf `find . -name "*.dSYM" -print`

# The Install
install: all
install -d $(DESTDIR)/$(PREFIX)/lib/
install $(TARGET) $(DESTDIR)/$(PREFIX)/lib/

此外,作为后续问题,如果我添加 $(OBJECTS)转到 <----- 行并删除 $(OBJECTS)从它之前的行开始编译。像这样:

$(SO_TARGET): $(TARGET) 
$(CC) -shared -o $@ $(OBJECTS)

那么有人可以回答我为什么吗 $(OBJECTS)没有解析为 String.o在线<-----

谢谢

最佳答案

这是因为 $(String.o) 将解析为另一个字符串——如果未定义 String.o 则可能是一个空字符串。

我想你应该更换

OBJECTS=$(String.o)

OBJECTS=String.o

关于c - makefile 中的变量,意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35931434/

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