2013-04-26 6 views
1

Я получил эту структуру каталогов:Makefile: Нет такого файла или каталога

- src 
    - /GUILayer 
    - /PhysicLayer 
    - /LogicLayer 
    - /Utilities 
    - main.cpp 
    - makefile 
    - makefile.inc 

И это мой текущий makefile внутри src:

include makefile.inc 

DIRS = PhysicLayer LogicLayer GUILayer Utilities 
OBJLIBS = PhysicLayer.a LogicLayer.a GUILayer.a Utilities.a 

EXTERNOBJ = $(foreach path, $(DIRS), $(wildcard $(path)/*.o)) 

TARGETS = main.cpp 
EXE = main 

all : $(EXE) 

%.a : 
    -for d in $(DIRS); do (cd $$d; $(MAKE)); done 
    ar cr [email protected] $^ 

main: $(OBJLIBS) 
    $(ECHO) $(CC) $(CFLAGS) $(EXTERNOBJ) $(OBJLIBS) -o [email protected] $(TARGETS) 
    $(CC) $(CFLAGS) $(EXTERNOBJ) $(OBJLIBS) -o [email protected] $(TARGETS) 

clean : 
    -$(RM) -f ./main 
    find . -name "*.o" -type f -print | xargs /bin/rm -f 
    find . -name "*.a" -type f -print | xargs /bin/rm -f 

файлы внутри папки генерировать. o просто отлично, но main не генерируется вообще. Это выход из терминала:

g++ -Wall -pedantic -pedantic-errors -g -ggdb PhysicLayer.a LogicLayer.a GUILayer.a Utilities.a -o main main.cpp 
/tmp/ccA3VJed.o: In function `main': 
/home/user/Desktop/project/src/main.cpp:14: undefined reference to `Indexador::Indexador()' 
/home/user/Desktop/project/src/main.cpp:19: undefined reference to `Indexador::indexar(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)' 
/home/user/Desktop/project/src/main.cpp:38: undefined reference to `Indexador::~Indexador()' 
/home/user/Desktop/project/src/main.cpp:38: undefined reference to `Indexador::~Indexador()' 
collect2: ld returned 1 exit status 
make: *** [main] Error 1 
+0

Вы должны предоставить действующую команду компиляции. Ваш make-файл повторяет что-то еще, что просто путает вещи. У команды, которую вы печатаете, на самом деле не будет файлов для компиляции. – juanchopanza

+0

Вы видите, что это 'g ++ -Wall -pedantic -pedantic-errors -g -ggdb -o Bloque.o' ничего не делает. Вам нужны некоторые входные файлы, и, по-видимому, вам нужно добавить '-c' где-то, чтобы скомпилировать объектный файл вместо исполняемого файла. Он должен выглядеть примерно так: g ++ -c -Wall -pedantic -pedantic-errors -g -ggdb Bloque.cpp -o Bloque.o' – juanchopanza

+0

@juanchopanza, можете ли вы прочитать исходное сообщение еще раз? Я обновил его. Спасибо! –

ответ

2

В правиле $(CC) $(CFLAGS) $(EXTERNOBJ) -c [email protected] $(TARGETS) вы должны изменить -c к -o, в противном случае g++ будет считать, что [email protected] является входной файл и ищет main, который еще не существует.

+0

Ummm Я все равно получаю ту же ошибку :(плюс некоторые неопределенные ссылки внутри 'main.cpp' в один из классов внутри' LogicLayer' –

+0

Вы забыли связать свои библиотеки. Можете ли вы попробовать добавить '$ (OBJLIBS)' к этому правилу ? $ (CC) $ (CFLAGS) $ (EXTERNOBJ) $ (OBJLIBS) -o $ @ $ (TARGETS) ' – Yang

+0

то, что вы предложили, имеет смысл, но я все еще получаю ошибку? См. Исходное сообщение с выходом терминала –

Смежные вопросы