2013-04-07 5 views
4

Я программирую приложение клиентского сервера UDP на языке программирования C; Я хочу автоматически скомпилировать 2 источника файлов и 3 файла заголовка всякий раз, когда меняются зависимости, поэтому я решил использовать утилиту make.скомпилировать заголовки зависимостей с make-файлом

Цель Makefile называется «редактировать»:

edit : server_UDP.o client_UDP.o \ 
      gcc -o edit server_UDP.o client_UDP.o \ 


    client_UDP.o : client_UDP.c cliHeader_UDP.h wrapHeader.h 
      gcc -c client_UDP.c 

    server_UDP.o : server_UDP.c servHeader_UDP.h wrapHeader.h 
      gcc -c server_UDP.c 

Это не вызывает перекомпиляции, когда я изменить несколько строк кода в wrapHeader.h.

Как мне изменить правило makefile edit, когда есть изменение в wrapHeader.h, чтобы перекомпилировать server_UDP и client_UDP?

** Примечание: wrapHeader.h является основной заголовок

cliHeader_UDP.h: включить "wrapHeader.h"

servHeader_UDP.h: включить "wrapHeader.h"

+1

Оба 'gcc' и Gnu' make' имеют * фантастический набор функций, которые при настройке для совместной работы друг с другом будут делать именно то, что вы ищете. Переключатель компилятора 'gcc -MM' будет * почти * генерировать для вас« совместимую с make »цель. Для получения информации о том, как это делается, и пример кода для тестирования, см. Онлайн-документы gnu make [на этом веб-сайте] (http://www.gnu.org/software/make/manual/html_node/index.html), с уделением особого внимания [этому разделу] (http://www.gnu.org/software/make/manual/html_node/Automatic-Prerequisites.html#Automatic-Prerequisites). – WhozCraig

+0

Возможный дубликат [Makefile, зависимостей заголовков] (http://stackoverflow.com/questions/2394609/makefile-header-dependencies) –

ответ

2

Я думаю, что вы хотите сделать файлы зависимостей.

Вы можете указать компилятору для создания файла зависимостей для вас с аргументами -MMD -MP, которые создают новый файл с тем же именем, что и исходный файл, кроме как с расширением * .d, в том же в качестве источника.

Файл зависимостей содержит все заголовки, от которых зависит код, что приведет к тому, что GNU сделает компиляцию исходного файла, если заголовок, который он использует, изменен.

Активированный пример файла зависимостей Makefile:

# Makefile 

CC := gcc 
LD := g++ 

# The output executable. 
BIN := program 

# Toolchain arguments. 
CFLAGS := 
CXXFLAGS := $(CFLAGS) 
LDFLAGS := 

# Project sources. 
C_SOURCE_FILES := mysourcefile1.c src/myothersrc.c 
C_OBJECT_FILES := $(patsubst %.c,%.o,$(C_SOURCE_FILES)) 

# The dependency file names. 
DEPS := $(C_OBJECT_FILES:.o=.d) 

all: $(BIN) 

clean: 
    $(RM) $(C_OBJECT_FILES) $(DEPS) $(BIN) 

rebuild: clean all 

$(BIN): $(C_OBJECT_FILES) 
    $(LD) $(C_OBJECT_FILES) $(LDFLAGS) -o [email protected] 

%.o: %.c 
    $(CC) -c -MMD -MP $< -o [email protected] $(CFLAGS) 

# Let make read the dependency files and handle them. 
-include $(DEPS) 

Это должно работать для вашей ситуации:

SOURCES := server_UDP.c client_UDP.c 
OBJECTS := $(patsubst %.c,%.o,$(SOURCES)) 

DEPS := $(OBJECTS:.o=.d) 

edit: $(OBJECTS) 
    gcc -o edit $(OBJECTS) 

%.o: %.c 
    gcc -c $< -o [email protected] 

-include $(DEPS) 
+0

мммм Я просмотрел полезные ссылки, но я не понял это, потому что iam new для makefile-утилиты так Dylan McKay может быть примером для моего файла редактирования, как поместить код, чтобы понять больше, coz i confused ... – zak

+0

Посмотрите на нижнюю часть обновленного ответа – Dylan

+0

, но я хочу больше узнать о makefile, что такое patsubst и что такое OBJECTS: = $ (patsubst% .c,%. O, $ (SOURCES)) DEPS: = $ (OBJECTS: .o = .d) – zak

0

Вы не сказали, что edit.c включает в себя два ваших конкретных заголовков, но я предполагаю, что это должен, если он связан с объектами.

Это именно тот сценарий, в котором makepp разыгрывается одна из его сильных сторон: Если следовать соглашению, что для каждого .o файла вам необходимо скомпоновать есть включать заявление соответствующего имени (в вашем случае, будет client_UDP.h & server_UDP.h), то makepp будет определять все, кроме обнаружения файлов заголовков в качестве зависимостей.

Это даже работает рекурсивно, поэтому, если у вас есть wrapHeader.c (где нет соответствующего оператора include в edit.c), который будет автоматически скомпилирован и связан.

Значит, вам не нужен makefile. Но если вы хотите, чтобы избежать вызова makepp edit каждый раз, то вы можете создать один-лайнер

edit: 

Вам нужно только научиться делать синтаксис, если у вас есть более сложные требования. Но если да, то нет предела.Помимо выполнения почти всего, что может сделать GNU, есть много более полезных вещей, и вы даже можете расширить свои make-файлы с помощью некоторых программ Perl.

+0

no edit - это файл для команд makefile, а client_UDP и server_udp - не заголовок ..... его коды суба – zak

+0

Извините, я не понимаю, что вы говорите. Если вы хотите перейти на наши форумы [sourceforge forums] (http://sourceforge.net/p/makepp/discussion/), и мы можем обсудить больше. Там вы также можете написать на эсперанто, на немецком или французском, если вам удобнее с одним из них. – Daniel

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