makefile 中的变量,意外行为
variable in makefile, unexpected behaviour
我在 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
我在 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