make: ожидается 2 зависимости, но существует только 1

#makefile #gnu-make

#makefile #gnu-make

Вопрос:

Давайте предположим, что у меня есть небольшой проект со следующим make-файлом. Пожалуйста, обратите внимание на генерацию o-файла (2 зависимости — для .cpp и .hpp).

 LIB_OPTS = -lpthread
CPP_OPTS = -std=c  11 -Wall

all: main
   ${CXX} ${CPP_OPTS} ${LIB_OPTS} *.o -o main

main: a.o b.o c.o main.o

%.o: %.cpp %.hpp
    ${CXX} ${CPP_OPTS} ${LIB_OPTS} -g -c

lt; -o $@

clean:
rm *.o

у a, b и c есть cpp и hpp-файлы.

у main есть только .cpp.

Вот результат.

 g   -std=c  11 -Wall -lpthread -g -c a.cpp -o a.o
g   -std=c  11 -Wall -lpthread -g -c b.cpp -o b.o
g   -std=c  11 -Wall -lpthread -g -c c.cpp -o c.o
g      -c -o main.o main.cpp
g   -std=c  11 -Wall -lpthread *.o -o main
 

А как насчет генерации main.o???

Откуда это взялось? Это не имеет ничего общего с моим правилом.

Если бы у меня был main.hpp, это соответствовало бы моему правилу. Конечно, я могу создать отдельное правило для main.o, но я ожидал, что %.o сделает это.

Спасибо за помощь! Крис

Ответ №1:

GNU make имеет ряд встроенных правил. Среди них есть правило, которое знает, как создать .o файл из .cpp файла. Поскольку ни одно из ваших правил не может создавать main.o , make просматривает свои собственные встроенные правила и находит то, которое он может использовать.

Вы можете просмотреть полный список встроенных правил, используя такую команду, как:

 make -pf/dev/null
 

Вы можете запустить make, чтобы он не использовал какие-либо собственные встроенные правила make -r .