2010-07-09 3 views
1

GCC 4.4.4компиляции с помощью Makefile

У меня есть следующие Makefile

OBJECT_FILES = brd.o logger.o test_brd.o 
CFLAGS = -m32 -ggdb -Wall -Wextra -D_REENTRANT -D_THREAD_SAFE -O0 -D_DEBUG 

# Linker Run-time library path 
LDFLAGS = -Wl,-rpath=/usr/NET/lib 

FLATFORM = -DLINUX 
TARGET = dlg 
CC = gcc -m32 

LIBS_PATH = -L/usr/NET/lib 
INC_PATH = -I/usr/NET/include 

LIBS = -lnc -lnxx -lphread 

$(TARGET): $(OBJECT_FILES) 
    $(CC) $(CFLAGS) $(LDFLAGS) $(OBJECT_FILES) $(FLATFORM) $(INC_PATH) $(LIBS_PATH) $(LIBS) -o $(TARGET) 

test_brd.o: test_brd.c brd.c 
    $(CC) -c $(CFLAGS) test_brd.c 

brd.o: brd.c logger.c 
    $(CC) -c $(CFLAGS) $(INC_PATH) brd.c 

logger.o: logger.c 
    $(CC) -c $(CFLAGS) $(INC_PATH) logger.c 

clean: 
    rm -f $(TARGET) $(OBJECT_FILES) 

Однако logger.c не нужно строить больше. Есть ли способ включить его в проект, не компилируя его каждый раз. Когда я убираю свой проект. Он снова скомпилирует его, и это большой файл.

Большое спасибо за любые предложения,

ответ

1

Вы могли бы изменить:

OBJECT_FILES = brd.o logger.o test_brd.o 

в:

OBJECT_FILES_EXCEPT_LOGGER = brd.o test_brd.o 
OBJECT_FILES = $(OBJECT_FILES_EXCEPT_LOGGER) logger.o 

и изменить ваш чистый, чтобы:

clean: 
    rm -f $(TARGET) $(OBJECT_FILES_EXCEPT_LOGGER) 

Но вся точка очистить это сделать полный перестраивать. Если вы не хотите полностью перестроить, просто используйте make самостоятельно, и он построит только то, что ему нужно. С правильно созданным make-файлом вам почти не нужно делать полную перестройку (единственное исключение, о котором я могу думать, это когда вы меняете сам makefile, но я даже обходите , что, заставляя все правила также зависеть от make-файла).

Кстати,

brd.o: brd.c logger.c 

и

test_brd.o: test_brd.c brd.c 

, кажется, не пишите мне - нет зависимости между brd.o и logger.c, ни между test_brd.o и brd.c (по крайней мере, на основе вашего компиляции). Единственный способ, которым у вас будет зависимость, - это то, что вы один файл C в другом, и это редко бывает хорошей идеей.

2

Какую Makefile говорит, что logger.c следует перекомпилировать, если и только если она новее, чем logger.o если существует. То, что я думаю, что вы, вероятно, хотите,

.PRECIOUS: logger.o 

где-то в файле, чтобы сказать, что сделать logger.o может быть промежуточный файл, но не должны быть удалены, когда делают думает, что это не будет нужно больше. Возможно, даже

.PRECIOUS: $(OBJECT_FILES) 

, чтобы продлить действие на все три объектных файла.

Редактировать: Er, вы понимаете, что, как правило, нет необходимости звонить make clean, правильно? Make - это все для обработки зависимостей для вас и только для восстановления того, что необходимо.

1

Это должно быть что-то вроде

SMALL_OBJECT_FILES = brd.o test_brd.o 
OBJECT_FILES = $(OBJECT_FILES) logger.o 

... 

clean: 
    rm -f $(TARGET) $(SMALL_OBJECT_FILES) 
1

Если не обновлять метку времени на logger.c, и не удалить logger.o, то файл не будет получать перекомпилировать.

Проблема в том, что ваша цель clean удаление: logger.o. При условии, что logger.o действительно используется вашим окончательным двоичным кодом, перекомпиляция неизбежна.

Вы должны расслабить один из двух ограничений:

  • Имея make clean фактически удалить все промежуточные объектные файлы
  • Возникли logger.c получить перекомпилировать после каждого make clean; make
1

Вы пробовали удаление logger.o из Makefile, как это:

OBJECT_FILES = brd.o test_brd.o 

EDIT:

и конечно:

$(TARGET): $(OBJECT_FILES) 
    $(CC) $(CFLAGS) $(LDFLAGS) $(OBJECT_FILES) logger.o $(FLATFORM) $(INC_PATH) $(LIBS_PATH) $(LIBS) -o $(TARGET) 
Смежные вопросы