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。有没有办法将它包含在项目中,而不必每次都编译它。当我清理我的项目时。它将再次重新编译它,它是一个大文件。
非常感谢任何建议,
答案 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.o
和logger.c
之间,test_brd.o
和brd.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)