2016-11-03 3 views
-2

Таким образом, это не должно давать столько же проблем, сколько есть, но я пытаюсь создать более эффективный make-файл с использованием подстановочных операторов, в отличие от утомительного метода, который я использовал для использования, где вы проходите, и делаете каждый отдельный объект файл, а затем связать их вместе. Но, по какой-то причине, когда я пытаюсь запустить «сделать», это дает мне это:Ошибка в Makefile?

multiple definition of 'ScreenMgr::ScreenMgr()' 
/path/to/ScrenMgr.cpp:4: first defined here 

то она дает мне другую ошибку сразу после того, как этот, который говорит:

undefined reference to main 
collect2: error: ld returned 1 exit status 

Хотя до них ошибки, мои .o создаются и помещаются в соответствующий каталог, поэтому ошибка должна быть связана с компоновщиком. Я могу включить источник C++, если кто-то подумает, что это поможет, но файлы практически пусты, как есть (хотя я все еще помещаю защитники заголовков), потому что я просто хотел убедиться, что все ссылки правильно, во-первых, поэтому я могу справиться с таких проблем, не беспокоясь о коде. Структура каталогов выглядит следующим образом:

-MsSolver 
|--src 
| |--main.cpp 
| |--ScreenMgr.cpp 
|--include 
| |--ScreenMgr.h 
|--build #empty directory 
| 
|--Makefile 
|: 
|--bin 

и вот Makefile:

+2

Ваша проблема не в вашем файле Makefile. Ваша проблема в ScreenMgr.cpp или ScreenMgr.h –

+0

Вероятно, у вас нет правильного включения защиты в файл заголовка. – Barmar

+0

Или, может быть, вы определяете конструктор в '.cpp' и' .h'. – Barmar

ответ

1
$(BUILDIR)/%.o: $(SRCS) 

Эта строка говорит make, что он может строить любой .o файл все из исходных файлов ,

$(CC) $(CFLAGS) -c $< -o [email protected] 

И в этой линии, $<означает первую зависимость, то есть исходный файл первый в $(SRCS), т.е. src/ScreenMgr.cpp.

Так сделать по существу сделать это для создания объектных файлов:

$(CC) $(CCFLAGS) -c src/ScreenMgr.cpp -o build/ScreenMgr.o 
$(CC) $(CCFLAGS) -c src/ScreenMgr.cpp -o build/main.o 
$(CC) $(LFLAGS) $(INCLUDES) $(LIBS) build/ScreenMgr.o build/main.o -o bin/mssolver 

на основе имен .o файлы, которые вы могли бы думать, что это работает правильно ... но это не так, это на самом деле, связывающие два " копии "ScreenMgr.cpp, а не связывание main.cpp!

Изменить его:

$(BUILDDIR)/%.o: $(SRCDIR)/%.cpp 

вместо этого.