2010-07-09 38 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)