2011-08-14 84 views
2

一個非常類似的問題,但不是那些頻繁詢問的確切問題;我的項目有以下佈局(跨平臺的,因此不同的IDE等)makefile內非標準目錄佈局

[Project] 
    | 
    |--- codeblocks 
    |  |- obj 
    |--- src 
    |--- visual_studio 

本質上講,我試圖讓我的生成文件(位於代碼塊目錄),編譯包含SRC內的文件,並將目標文件放入obj目錄。

編譯身邊,我可以沒有問題acheive,但我不能爲我的生活弄清楚如何讓make使用這種替代的目錄作爲默認地點爲目標文件;之後我可以這樣做,但意味着我每次執行構建時都必須重新編譯整個應用程序,這會破壞makefile的對象。通過閱讀make文檔(是的,我確實先試了一下,並且學到了一些額外的東西!),我遇到了一些例子,比如 $(OBJDIR)/%.o: %.c,但是make找不到規則來利用它,而我遠不足夠的經驗來它制定出自己:(

任何人都可以點我在正確的方向,或者提供一些適當的提示嗎?

回答

1

下面是一個簡單的示例Makefile演示如何做到這一點。

SOURCES = $(wildcard src/*.c) 
OBJECTS = $(SOURCES:src/%.c=obj/%.o) 

obj/%.o: src/%.c 
     $(CC) $(CFLAGS) -c -o [email protected] $< 

target.exe: $(OBJECTS) 
     $(CC) -o [email protected] $^ $(LDFLAGS) $(LDLIBS) 

的目錄結構和Makefile文件所需的文件有:

project/ 
project/Makefile 
project/src/*.c 
project/obj 

我測試了我的機器上並運行正確:

$ make 
cc -c -o obj/main.o src/main.c 
cc -o target.exe obj/main.o 
+0

完美!工作得很好,謝謝。我將再次閱讀該手冊並確認我正確地得到它! – sighbeans

0

如果您正在使用GNU做,你可以使用擴展你可以有規則

$(OBJDIR)/%.o: $(SRCDIR)/%.c 
     $(CC) $(CFLAGS) -c -o [email protected] $^ 

編譯源文件。額外的複雜因素是,鏈接規則還需要爲所有對象文件指定$(OBJDIR)。您可以使用類似

SOURCES = $(wildcard $(SRCDIR)/*.c) 
OBJECTS = $(SOURCES:$(SRCDIR)/%.c=$(OBJDIR)/%.o) 

$(TARGET): $(OBJECTS) 
     $(CC) -o [email protected] $^ $(LDFLAGS) $(LDLIBS) 

或者,你可以使用VPATH以避免在這些地方爲$(SRCDIR)的需要。

+0

感謝您的答覆,可悲的是我m仍然像以前一樣得到相同的錯誤:'code'(2)%make proj make:***沒有規則來製作'proj'需要的目標'obj/*。o'。停止。 (2)%make --version GNU Make 3.82'code' – sighbeans

+0

Make不會自動擴展球體。 –