Я должен предварить это, сказав, что я новичок в 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», и с тех пор так и осталось.
Я был бы очень признателен за любую помощь. Спасибо!
Простой способ думать о правиле 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-файле. Так что, если вы поставите на первое место то, что обычно хотите построить, вы сэкономите некоторую печать.