Переменная в make-файле, непредвиденное поведение
У меня есть 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 ответ
Решение
Это потому что $(String.o)
разрешит в другую строку - возможно, пустую строку, если String.o
не определено.
Я думаю, вы должны заменить
OBJECTS=$(String.o)
с
OBJECTS=String.o