Исключение make создает объектный файл не в той папке

#makefile #ubuntu-16.04

#makefile #ubuntu-16.04

Вопрос:

Я новичок в Ubuntu и, следовательно, в make file. Я успешно создал make-файл со структурой папок. Однако, если я добавлю аналогичную структуру, я получу сообщение об ошибке.

Я успешно выполнил команду make и запустил приложение с одним основным файлом cpp и двумя файлами (list_menu.cpp и list_menu.h ) в подпапках cpp11_and_cpp14_menu

структура папок выглядит точно так же, как показано ниже, где cpp11_and_cpp14.cpp имеет основную функцию.

 ../advancedcppproject/
    cpp11_and_cpp14.cpp
    Makefile

../advancedcppproject/cpp11_and_cpp14_menu
    list_menu.cpp  
    list_menu.h 

../advancedcppproject/multi_threading_example
    multi_threading.cpp  
    multi_threading.h
  

Содержимое файла Make является

 cpp11_and_cpp14 : cpp11_and_cpp14.o ./multi_threading_example/multi_threading.o ./cpp11_and_cpp14_menu/list_menu.o
        g   cpp11_and_cpp14.o ./multi_threading_example/multi_threading.o ./cpp11_and_cpp14_menu/list_menu.o -o cpp11_and_cpp14

cpp11_and_cpp14.o : cpp11_and_cpp14.cpp ./cpp11_and_cpp14_menu/list_menu.h ./multi_threading_example/multi_threading.h
        g   -c cpp11_and_cpp14.cpp

./cpp11_and_cpp14_menu/list_menu.0 : ./cpp11_and_cpp14_menu/list_menu.cpp ./cpp11_and_cpp14_menu/list_menu.h
        g   -c ./cpp11_and_cpp14_menu/list_menu.cpp

./multi_threading_example/multi_threading.o : ./multi_threading_example/multi_threading.cpp ./multi_threading_example/multi_threading.h
        g   -c ./multi_threading_example/multi_threading.cpp

  

После выполнения команды make происходит сбой с сообщением об ошибке

 g   -c ./multi_threading_example/multi_threading.cpp 
g   cpp11_and_cpp14.o ./multi_threading_example/multi_threading.o ./cpp11_and_cpp14_menu/list_menu.o -o cpp11_and_cpp14
g  : error: ./multi_threading_example/multi_threading.o: No such file or directory
Makefile:6: recipe for target 'cpp11_and_cpp14' failed
make: *** [cpp11_and_cpp14] Error 1

  

Я ожидаю, что multi_threading.o будет создан в папке ../advancedcppproject/multi_threading_example. Однако многопоточность.o создается в ../advancedcppproject.

Где как list_menu.o правильно создан в ../advancedcppproject/cpp11_and_cpp14_menu.

Что не так?

Комментарии:

1. По умолчанию gcc создает выходные файлы в текущем каталоге (pwd). Который все тот же, с которого был запущен make. КСТАТИ. Используйте переменные (вкл. автоматически) и шаблонов, поскольку ваш makefile практически нечитаем / недоступен для обслуживания человеком.

2. Спасибо, Мэтт, но я вижу, что list_menu.o создается в его подпапке. Есть ли какой-либо способ, которым я могу это сделать, что многопоточность. o также создается в соответствующей папке?

3. Используйте опцию gcc -o.

4. Ваш пример вообще не указывает на то, что он создается list_menu.o , и в вашем makefile фактически нет правила для этого. Мы можем улучшить этот makefile, но вы должны внести свой вклад.

5. Спасибо Бета, мой единственный вопрос в том, почему при той же файловой структуре и тех же соответствующих записях в Makefile я вижу menu_list.o в его подпапке (../ advancedcppproject/cpp11_and_cpp14_menu) и многопоточность. o в основной папке (../advancedcppproject/)