makefile中的变量,意外行为

时间:2016-03-11 02:58:42

标签: c makefile gnu working-set

我有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<-----解析?

谢谢

1 个答案:

答案 0 :(得分:6)

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

我想你应该替换

OBJECTS=$(String.o)

OBJECTS=String.o