компиляция с использованием Makefile - PullRequest
1 голос
/ 09 июля 2010

gcc 4.4.4

У меня есть следующий 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 больше не нужно собирать.Есть ли способ включить его в проект без необходимости каждый раз его компилировать.Когда я уберу свой проект.Он перекомпилирует его снова, и это большой файл.

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

Ответы [ 5 ]

2 голосов
/ 09 июля 2010

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

.PRECIOUS: logger.o

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

.PRECIOUS: $(OBJECT_FILES)

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

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

1 голос
/ 09 июля 2010

Вы пытались удалить 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)
1 голос
/ 09 июля 2010

Вы можете изменить:

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-файле вам почти никогда не потребуется выполнять полное перестроение (единственное исключение, о котором я могу подумать, это когда вы меняете сам make-файл, но я даже игнорирую , что , заставляя все правила зависеть от также makefile).

Кстати,

brd.o: brd.c logger.c

и

test_brd.o: test_brd.c brd.c

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

1 голос
/ 09 июля 2010

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

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

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

  • Наличие make clean фактически удаляет все промежуточные объектные файлы
  • После перекомпиляции logger.c после каждого make clean; make
1 голос
/ 09 июля 2010

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

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

...

clean:
    rm -f $(TARGET) $(SMALL_OBJECT_FILES)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...