2014-10-20 4 views
0

Я учусь, как сделать Makefile в g ++. Я использую следующие example Коды для проекта here .Это является MakefileMakeFile в g ++. Игнорируемые команды

# Makefile for Writing Make Files Example 

# ***************************************************** 
# Variables to control Makefile operation 

CXX = g++ 
CXXFLAGS = -Wall -g 

# **************************************************** 
# Targets needed to bring the executable up to date 

main: main.o Point.o Rectangle.o # ***Statement : 1 
    $(CXX) $(CXXFLAGS) -o main main.o Point.o Rectangle.o #Commands underneath dependencies have tabs before them 

# The main.o target can be written more simply 

main.o: Point.h Rectangle.h   # ***Statement : 2 
    $(CXX) $(CXXFLAGS) -c main.cpp 

Point.o: Point.h      # ***Statement : 3 


Rectangle.o: Rectangle.h Point.h  # ***Statement : 4 

Теперь у меня есть некоторые вопросы, касающиеся этого я также ссылаются конкретные строки с помощью оператора ключевое слово для облегчения допроса.

1- Насколько я понимаю, правильное утверждение 1. Когда g ++ встречает main.o (который является зависимостью для target main.o) после main: он переходит к target main.0 (утверждение 2). Затем он проверяет зависимость main.o, если зависимость (два файла заголовка найдены), тогда она запускает команду. Затем она возвращается, чтобы выполнить свою задачу для следующей зависимости и так далее?

2-зависимость для Point.o, которая является Point.h, почему не существует никакой команды как таковой

$(CXX) $(CXXFLAGS) -c Point.cpp 

и аналогично для Rectangle.o, почему не существует никакой команды для ее зависимости как таковой

$ (CXX) $ (CXXFLAGS) -c Rectangle.cpp

Я был бы признателен, если бы кто-нибудь мог это прояснить.

+0

Вы отсутствуете 'xxx.cpp' в зависимости для' xxx.o' ... – PiotrNycz

+0

@PiotrNycz Моей версии GNU Make (3.81) implicitl y добавляет эту зависимость. – juanchopanza

ответ

3
  1. Исправить. Стоит отметить, что gnu make использует время модификации, чтобы определить, удовлетворяются ли зависимости.

  2. make имеет implicit rules для строительства .o целей. Они используют переменные, такие как $CXX и $CXXFLAGS. Для заданной цели, например, foo.o, make применит правило в зависимости от наличия исходного файла foo.<ext>, создавая пару целевой цели foo.o : foo.<ext>. Если расширение является C++ один (например, .cpp, .cc, .C), то он будет применять правило вдоль линий

    $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c

Вы указали экстренное DEPENDENCY для Point.o. Это добавляется к неявной зависимости Point.cpp. Если время модификации либо Point.h, либо Point.cpp новее, чем Point.o, правило будет запущено.

Как @Basile указал в комментариях, вы можете вызвать make с -p или --print-data-base вариантами, чтобы получить информацию о «состоянии» замыкающие, в том числе неявных правил.С его помощью с Grep, например, я могу запросить неявные правила для построения .o из файлов, C++:

make -p | grep -A 1 -B 1 COMPILE.cc 

Выход:

# default 
COMPILE.cpp = $(COMPILE.cc) 
# makefile (from `Makefile', line 1) 
-- 
-- 
# default 
COMPILE.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c 
# environment 
-- 
-- 
# default 
COMPILE.C = $(COMPILE.cc) 
# environment 
-- 
-- 
# commands to execute (built-in): 
     $(COMPILE.cc) $(OUTPUT_OPTION) $< 

-- 
-- 
# commands to execute (built-in): 
     $(COMPILE.cc) $(OUTPUT_OPTION) $< 

Что касается правила вы Увеличенная, Point.o : Point.h, это то, что мой версия выпуска будет производить:

make -p | grep -A 1 -B 1 Point 
.... 
Point.o: Point.cpp Point.h 
# Implicit rule search has been done. 
.... 
+0

запустите 'make -p', чтобы понять неявные правила. –

+0

@BasileStarynkevitch Хорошее предложение. Я добавил пример. – juanchopanza

+0

Спасибо, что поняли. В последнем вопросе вы заявили, что «неявное правило будет выполняться, когда эти зависимости не будут выполнены. По умолчанию неявное правило для объекта Point.o будет зависеть только от исходного файла, такого как Point.cpp.». Дополнительная зависимость Point.o - Point.h, которая в этом случае выполняется. Будет ли в этом случае выполняться неявное правило? – Rajeshwar

Смежные вопросы