使用Makefile进行编译

时间:2010-07-09 07:19:41

标签: makefile

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 个答案:

答案 0 :(得分:2)

Makefile所说的logger.c应当重新编译logger.o当且仅当它比.PRECIOUS: logger.o 更新时才会重新编译。我认为你可能想要的是

logger.o

在你的文件中某处告诉make .PRECIOUS: $(OBJECT_FILES) 可能是一个中间文件,但是当make认为它不再需要它时,不应该删除它。甚至可能

make clean

将效果扩展到所有三个目标文件。

编辑:呃,你确实意识到通常不需要拨打{{1}},对吧? Make就是为您处理依赖关系而只重建所需的东西。

答案 1 :(得分:1)

应该是

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

...

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

答案 2 :(得分:1)

如果您未更新logger.c上的时间戳,并且未删除logger.o,则不会重新编译该文件。

问题是您的clean目标正在删除logger.o。如果您的最终二进制文件确实使用了logger.o,则重新编译是不可避免的。

你必须放松两个限制之一:

  • make clean实际删除所有中间对象文件
  • 在每个logger.c
  • 之后重新编译make clean; make

答案 3 :(得分: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,它将只构建它所需的内容。使用正确构建的makefile,您几乎不需要进行完全重建(我能想到的唯一例外是当您更改makefile本身但我甚至通过使所有规则依赖而绕过 在makefile上也是如此)。

顺便说一下,

brd.o: brd.c logger.c

test_brd.o: test_brd.c brd.c

似乎没有写信给我 - brd.ologger.c之间,test_brd.obrd.c之间没有依赖关系(至少基于你的编译语句)。你有一个依赖的唯一方法是你#include在另一个C文件中有一个C文件,这很少是一个好主意。

答案 4 :(得分:1)

您是否尝试过删除Makefile中的logger.o

OBJECT_FILES = brd.o test_brd.o

修改

当然:

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