Проблемы с Makefile с флагами gcc (файл не распознан; общие библиотеки) - PullRequest
0 голосов
/ 06 июня 2011

Я немного растерялся. Я пытаюсь заставить работать 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

Надеюсь, у некоторых есть ответ для меня! Спасибо!

1 Ответ

0 голосов
/ 06 июня 2011

В этой части есть что-то очень странное:

MODUL = Buffer
COMPONENTS = Buffer.h
MK_LIBRARY = lib$(MODUL).so

$(MK_LIBRARY): $(COMPONENTS)
  $(CXX) $(CXXFLAGS) -shared -o $@ $^

Это правило пытается построить libBuffer.so из Buffer.h, файла заголовка.Как это может работать, без определения вещей в Buffer.cc?Я бы сделал это следующим образом:

lib%.so: %.o
    $(CXX) $(CXXFLAGS) -shared -o $@ $^

РЕДАКТИРОВАТЬ:
У вас есть определения буфера в Buffer.h?Хорошо, у вас есть более одной проблемы, и единственный способ их решить - сделать то, что почти всегда работает: отступить к более простой проблеме и решить ее в первую очередь.Вы можете сделать Buffer.o?И можете ли вы затем связать это в свой исполняемый файл (в обход libBuffer.so)?А если нет, можете ли вы написать «HelloWorld» в Buffer/ и связать Buffer.o в , что ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...