Почему make добавляет «.o» в конец моего заголовочного файла? - PullRequest
0 голосов
/ 27 сентября 2019

Я пытаюсь построить проект с подкаталогами, используя make, я заставил рекурсивную часть make работать, но по какой-то причине она, кажется, берет предварительные условия зависимостей исходного файла и добавляет к ним .o, а затемпытается их скомпилировать, что явно не работает, почему он это делает?

Рассматриваемое правило выглядит так:

operations_cache.o : memory_management/operations_cache.cpp memory_management/operations_cache.hpp \
    function.hpp operations/operation_base.hpp
    cd memory_management && $(MAKE) $@

Правило, которое компилирует каталог operationsвыглядит так:

operation_%.o : function.hpp
    cd operations && $(MAKE) $@

по какой-то причине, make продолжает пытаться сказать, что operations/operation_base.hpp.o является допустимой целью, хотя у меня ее нет нигде в файле make.Я прочитал документацию для и не увидел в ней ничего о попытках неявного определения объектов на основе обязательных имен файлов, поэтому я очень запутался в том, что заставляет его делать это.

Я получаю следующую ошибку:

g++    -c -o main.o main.cpp
g++    -c -o node.o node.cpp
cd memory_management && make unique_table.o
make[1]: Entering directory './memory_management'
g++ -o ../unique_table.o -c unique_table.cpp
make[1]: Leaving directory './memory_management'
cd operations && make operations/operation_base.hpp.o
make[1]: Entering directory './operations'
g++ -o ../operations/operation_base.hpp.o -c 
g++: fatal error: no input files
compilation terminated.
Makefile:10: recipe for target 'operations/operation_base.hpp.o' failed
make[1]: *** [operations/operation_base.hpp.o] Error 1
make[1]: Leaving directory './operations'
Makefile:24: recipe for target 'operations/operation_base.hpp.o' failed
make: *** [operations/operation_base.hpp.o] Error 2

Редактировать Добавлены полные файлы

По запросу пользователя, здесь находятся полные файлы make моих 3 каталогов

. / Makefile

CC = g++
objects = main.o node.o unique_table.o operations_cache.o function.o operation_base.o operation_and.o
# shared_lib = nodelib.so

all : edit # $(shared_lib)

edit : $(objects)
    $(CC) -o edit $(objects)

main.o : main.cpp node.hpp memory_management/unique_table.hpp memory_management/operations_cache.hpp

node.o : node.cpp node.hpp

unique_table.o : memory_management/unique_table.cpp memory_management/unique_table.hpp node.hpp
    cd memory_management && $(MAKE) $@

operations_cache.o : memory_management/operations_cache.cpp memory_management/operations_cache.hpp \
    function.hpp operations/operation_base.hpp
    cd memory_management && $(MAKE) $@

function.o : function.cpp function.hpp node.hpp memory_management/unique_table.hpp

operation_%.o : function.hpp
    cd operations && $(MAKE) $@

.PHONY : clean
clean :
    rm edit $(objects)

. / Operations / Makefile

CC = g++
objects = operation_base.o operation_and.o operation_or.o operation_xor.o operation_restrict.o operation_composition.o operation_satisfy.o operation_satisfy_all.o
proj_dir = ../

operation_base.o : operation_base.cpp operation_base.hpp $(proj_dir)function.hpp

operation_and.o : operation_and.cpp operation_and.hpp operation_base.hpp $(proj_dir)function.hpp

operation_or.o : operation_or.cpp operation_or.hpp operation_base.hpp $(proj_dir)function.hpp

operation_xor.o : operation_xor.cpp operation_xor.hpp operation_base.hpp $(proj_dir)function.hpp

operation_composition.o : operation_composition.cpp operation_composition.hpp operation_base.hpp $(proj_dir)function.hpp

operation_restrict.o : operation_restrict.cpp operation_restrict.hpp operation_base.hpp $(proj_dir)function.hpp

operation_satisfy.o : operation_satisfy.cpp operation_satisfy.hpp operation_base.hpp $(proj_dir)function.hpp

operation_satisfy_all.o : operation_satisfy_all.cpp operation_satisfy_all.hpp operation_satisfy.hpp

%.o : 
    $(CC) -o $(proj_dir)$@ -c $<

. / Memory_management / Makefile

CC = g++
objects = operations_cache.o unique_table.o
proj_dir = ../

operations_cache.o : operations_cache.cpp operations_cache.hpp \
    $(proj_dir)function.hpp $(proj_dir)operations/operation_base.hpp

unique_table.o : unique_table.cpp unique_table.hpp $(proj_dir)node.hpp

%.o : 
    $(CC) -o $(proj_dir)$@ -c $<

Редактировать Я нашел решение

Удаление memory_management/operations_cache.cpp memory_management/operations_cache.hpp function.hpp operations/operation_base.hpp из строки operations_cache.o решает проблему, она не объясняет, почему произошла ошибка, но работает, мне все равно было бы интересно понять, почему это произошло.

...