#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
.