2010-07-09 73 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就可以了,它只会构建它需要的东西。使用正确构建的makefile,几乎不需要执行完全重建(我能想到的唯一例外是当您更改makefile本身时,但我甚至通过使所有规则依赖于makefile来绕过 )。

顺便说一句,

brd.o: brd.c logger.c 

test_brd.o: test_brd.c brd.c 

似乎并没有给我写信 - 有brd.ologger.c之间没有相关性,也不test_brd.obrd.c之间(至少根据您的编译语句)。如果你在另一个C文件中存在一个依赖关系,那么唯一的办法就是这样做,这并不是一个好主意。

2

Makefile说那是什么logger.c如果要重新编译且仅当它是新的比logger.o如果存在。我想你可能想要的是

.PRECIOUS: logger.o 

在文件告诉做出logger.o可能是中间文件的地方,但每当化妆认为它不会需要任何更多的不应该被删除。甚至可以使用

.PRECIOUS: $(OBJECT_FILES) 

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

编辑:呃,你知道通常不需要拨打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

您是否尝试过在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)