2017-02-06 3 views
0

Я написал makefile для своего мини-проекта с gedit. , когда я запускаю «make», все * .o и исполняемые файлы созданы. После того, как я изменил один из моих файлов (без make clean или make -B) , он снова скомпилирует файл chaneged и снова свяжет все объекты. Но исполняемый файл работает так, как будто ничего не меняется. (после того, как «сделать -B» исполняемый файл запуск ок)Whats worng с файлом формата make

CC = g++ 
CFLAGS = -Wall 
OBJS = pawn.o knight.o bishop.o rook.o queen.o king.o board.o       
movement.o game.o 

all: ex1 

ex1: $(OBJS) 
    $(CC) $(CFLAGS) $(OBJS) -o ex1 


pawn.o: chess/tools/pawn.cpp chess/tools/tool.hpp 
    $(CC) $(CFLAGS) -c chess/tools/pawn.cpp 

knight.o: chess/tools/knight.cpp chess/tools/tool.hpp 
    $(CC) $(CFLAGS) -c chess/tools/knight.cpp 

bishop.o: chess/tools/bishop.cpp chess/tools/tool.hpp 
    $(CC) $(CFLAGS) -c chess/tools/bishop.cpp 

rook.o: chess/tools/rook.cpp chess/tools/tool.hpp 
    $(CC) $(CFLAGS) -c chess/tools/rook.cpp 

queen.o: chess/tools/queen.cpp chess/tools/tool.hpp 
    $(CC) $(CFLAGS) -c chess/tools/queen.cpp 

king.o: chess/tools/king.cpp chess/tools/tool.hpp 
    $(CC) $(CFLAGS) -c chess/tools/king.cpp 

board.o: chess/board.cpp chess/board.hpp 
    $(CC) $(CFLAGS) -c chess/board.cpp 

movement.o: chess/movement.cpp 
    $(CC) $(CFLAGS) -c chess/movement.cpp 

game.o: chess/game.cpp 
    $(CC) $(CFLAGS) -c chess/game.cpp 

clean: 
    rm *.o 

Если есть другая проблема или предложение с конструкцией файла макияжа, я буду рад услышать об этом.

Редактировать

1) Программа не печатает ничего на экране. 2) Изменение в king.cpp файл (находится в другой папке) Печать Печать Переключаю на экране

[[email protected] chess]$ ls 
    chess ex1 Makefile 
    [[email protected] chess]$ ls chess 
    board.cpp board.hpp game.cpp movement.cpp tools 
    [[email protected] chess]$ ls chess/tools 
    bishop.cpp king.cpp knight.cpp pawn.cpp queen.cpp rook.cpp  tool.hpp 

    [[email protected] chess]$ make 
    g++ -Wall -c chess/tools/pawn.cpp 
    g++ -Wall -c chess/tools/knight.cpp 
    g++ -Wall -c chess/tools/bishop.cpp 
    g++ -Wall -c chess/tools/rook.cpp 
    g++ -Wall -c chess/tools/queen.cpp 
    g++ -Wall -c chess/tools/king.cpp 
    g++ -Wall -c chess/board.cpp 
    g++ -Wall -c chess/movement.cpp 
    g++ -Wall -c chess/game.cpp 
    g++ -Wall pawn.o knight.o bishop.o rook.o queen.o king.o board.o movement.o game.o -o ex1 
    [[email protected] chess]$ ./ex1 
    [[email protected] chess]$ *** AT this stage i change the file 
    [[email protected] chess]$ 
    [[email protected] chess]$ make 
    g++ -Wall -c chess/tools/king.cpp 
    g++ -Wall pawn.o knight.o bishop.o rook.o queen.o king.o board.o movement.o game.o -o ex1 
    [[email protected] chess]$ ./ex1 
    [[email protected] chess]$ 
    [[email protected] chess]$ make -B 
    g++ -Wall -c chess/tools/pawn.cpp 
    g++ -Wall -c chess/tools/knight.cpp 
    g++ -Wall -c chess/tools/bishop.cpp 
    g++ -Wall -c chess/tools/rook.cpp 
    g++ -Wall -c chess/tools/queen.cpp 
    g++ -Wall -c chess/tools/king.cpp 
    g++ -Wall -c chess/board.cpp 
    g++ -Wall -c chess/movement.cpp 
    g++ -Wall -c chess/game.cpp 
    g++ -Wall pawn.o knight.o bishop.o rook.o queen.o king.o board.o movement.o game.o -o ex1 
    [[email protected] chess]$ ./ex1 
    Print Change 
    [[email protected] chess]$ 
+0

Чтобы уточнить, если вы изменили исходный файл и запустили 'make', объектный файл будет построен, но исполняемый' ex1' не будет повторно использован? Можете ли вы, возможно, скопировать-вставить вывод 'make' в свой вопрос, чтобы мы могли видеть его выход? Как вы используете свое приложение? Вы меняете каталоги в любое время при создании или до запуска вашей программы? –

+1

В отсутствие флага '-o' для' $ (CC) ', объектные файлы создаются рядом с источниками. Итак, скажем, вы меняете 'chess/tools/king.cpp' и говорите' make', тогда вы получите новый 'chess/tools/king.o'. Но 'ex1' хочет связать с' king.o', а не 'chess/tools/king.o'. Что не объясняет, почему 'make -B' помогает, но, возможно, я чего-то не хватает? –

+0

Вы сохраняете файл с изменениями перед компиляцией? –

ответ

0

Try следующий Makefile:

CXX := g++ 
CXXFLAGS := -Wall 
OBJS := pawn.o knight.o bishop.o rook.o queen.o king.o board.o movement.o game.o 

COMPILE_CMD = ${CXX} -c -o [email protected] ${CXXFLAGS} -MD -MP $< 
LINK_CMD = ${CXX} -o [email protected] ${LDFLAGS} $^ 

all: ex1 

ex1: ${OBJS} 
    ${LINK_CMD} 

%.o : chess/tools/%.cpp 
    ${COMPILE_CMD} 

%.o : chess/%.cpp 
    ${COMPILE_CMD} 

-include $(OBJS:%.o=%.d) 

clean: 
    rm -f *.o *.d 

.PHONY: clean all 

Изменения:

  1. Использование ${CXX} для кода на C++.
  2. Автоматическое создание зависимостей заголовков.
  3. Используйте правила шаблонов, чтобы избежать повторения.
  4. Укажите .o выходные файлы.
  5. Отметить цели clean и all как .PHONY.
  6. Используйте LDFLAGS для связи.
Смежные вопросы