сделать не выполняется правильный Makefile

Я должен предварить это, сказав, что я новичок в Makefiles.

Я создал следующий Makefile:

all: tiling_graph.o
g++ -o tiling_graph tiling_graph.o -L/usr/local/lib -ligraph

Я пытаюсь убедиться, что -ligraph включен. Однако, когда я набираю «make», я получаю следующий вывод: «c ++ -c -o tiling_graph.o tiling_graph.cpp»

Почему он не использует Makefile, который я создал в текущем каталоге? Я пытался использовать «make -f Makefile» и «make —file = Makefile», но ни один из них не работает.

Кроме того, сразу после того, как я сделал Makefile, он работал правильно. Вывод после ввода make был
«g ++ -o tiling_graph tiling_graph.o -L / usr / local / lib -ligraph»

Я выполнил ./tiling_graph, и это было успешно.

Затем я отредактировал tiling_graph.cpp, снова запустил make, и на выходе получилось «c ++ -c -o tiling_graph.o tiling_graph.cpp», и с тех пор так и осталось.

Я был бы очень признателен за любую помощь. Спасибо!

1

Решение

Простой способ думать о правиле make:

target: dependency list
commands to make the target

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

Обратите внимание, что make довольно много знает о том, как создавать файлы. В частности, он имеет много встроенных шаблонных правил, поэтому он знает, например, как создать объектный файл (prog.o) из исходного файла C ++ (prog.cpp) или из исходного файла C (prog.c) или многое другое. Таким образом, вам действительно нужно написать make-файл, когда у вас есть другие требования, например, библиотека (и даже тогда вы можете просто добавить это в переменную окружения, но make-файл лучше).

Теперь вы на самом деле не хотите создавать файл с именем all, Вы хотите создать файл с именем tiling_graph, Таким образом, правильное правило make будет:

tiling_graph: tiling_graph.o
g++ -o tiling_graph tiling_graph.o -L/usr/local/lib -ligraph

поскольку make уже умеет создавать tiling_graph.o, это может на самом деле выяснить, как сделать tiling_graph от tiling_graph.cpp,

Так где же это all родом из? Обычный способ использования all является:

all: program1 program2 program3

который говорит make что all цель требует program1, program2 а также program3, Так что если вам нужно построить все три из этих программ, all правило позволит вам просто сделать один make команда. Поскольку нет файла с именем all, это «фальшивая» цель и (по крайней мере с gnu make) она должна быть объявлена ​​как фальшивая цель:

all: tiling_graph
.PHONY: all

Но вам это действительно не нужно, если вы просто хотите создать одну программу.

Когда вы просто печатаете make (в отличие от make target), make выбирает первую цель в make-файле. Так что, если вы поставите на первое место то, что обычно хотите построить, вы сэкономите некоторую печать.

2

Другие решения


По вопросам рекламы [email protected]