Я немного растерялся. Я пытаюсь заставить работать Makefile, но он ломается. Я надеюсь, что кто-то может помочь мне с этим плохим и разочаровывающим убийцей времени.
Я написал небольшую и легкую часть компилятора.
Проект имеет следующую структуру:
/ Compiler.cpp
/ Makefile
/ Buffer /
/ Buffer / Makefile
/ Сканер /
/ Сканер / Makefile
/ SymTable /
/ SymTable / Makefile
Когда я компилирую руководство по Buffer, Scanner и SymTable (смена каталога и ввод 'make mode = release', это не проблема, и каждая разделяемая библиотека компилируется). Но когда я запускаю Makefile изнутри, где находится «Master Makefile» / Makefile, он не работает, и терминал печатает что-то вроде:
Buffer/libBuffer.so: file not recognized: File format not recognized
collect2: ld returned 1 exit status
make: \*** [Compiler] Error 1
Вот список Makefile для / Buffer / Makefile (то же самое для Scanner и SymTable):
CXX = g++
ifeq ($(mode),release)
CXXFLAGS = -g -fPIC -O3 -ffunction-sections -march=native
else
mode = debug
CXXFLAGS = -g3
endif
MODUL = Buffer
COMPONENTS = Buffer.h
MK_LIBRARY = lib$(MODUL).so
all: $(MK_LIBRARY)
$(MK_LIBRARY): $(COMPONENTS)
$(CXX) $(CXXFLAGS) -shared -o $@ $^
clean:
rm -f $(MK_LIBRARY)
.PHONY: all
.PHONY: clean
«Мастер Makefile» выглядит так:
CXX = g ++
ifeq ($(mode),release)
CXXFLAGS = -g -O3 -ffunction-sections -fwhole-program -march=native
else
mode = debug
CXXFLAGS = -g3
endif
TARGET = Compiler
COMPONENTS = $(TARGET)
DIRS = Buffer Scanner SymTable
MAKE = make
MFLAGS = mode=$(mode)
all: $(COMPONENTS)
$(TARGET): Compiler.cpp libBuffer.so libScanner.so libSymTable.so
$(CXX) $(CXXFLAGS) -IBuffer -IScanner -ISymTable \
-LBuffer -LScanner -LSymTable \
-lBuffer -lScanner -lSymTable -o $@ Compiler.cpp
libBuffer.so: force_look
cd Buffer; $(MAKE) $(MFLAGS)
libScanner.so: force_look
cd Scanner; $(MAKE) $(MFLAGS)
libSymTable.so: force_look
cd SymTable; $(MAKE) $(MFLAGS)
clean:
rm -f $(COMPONENTS)
@for d in $(DIRS); do (cd $$d; $(MAKE) clean ); done
check:
@for d in $(DIRS); do (cd $$d; $(MAKE) check ); done
force_look:
true
.PHONY: all
.PHONY: clean
.PHONY: check
Надеюсь, у некоторых есть ответ для меня! Спасибо!