把object放到同一個目錄的Makefile寫法,目標檔案同一目錄

查志強發表於2014-06-10

【原文:http://m.blog.csdn.net/blog/lanmanck/8462088

相信很多同學都在思考這個問題:

Makefile裡面怎麼把object檔案放到一個指定目錄,而不是跟c檔案在一起?

今天來分享下這個makefile的寫法:

情形1:Makefile與原始碼在同一個目錄或者位於父目錄下,我們要把中間檔案放到obj目錄,例如:

src

   --src2

inc

obj

Makefile

則makefile內容可以為:

source = $(wildcard *.c) $(wildcard src2/*.c)
objs = $(source:%.c=%.o)


all: $(objs)
	gcc -o $@ $^
	@echo done

$(objs): %.o : %.c
	gcc -c $< -o $@

這是個通用的makefile,object檔案仍然與C檔案放在一起,我們改一下:

OBJDIR = obj
vpath %.c src2
source = $(wildcard *.c) $(notdir $(wildcard src2/*.c))
objs = $(source:%.c=$(OBJDIR)/%.o)

all: $(objs)
    gcc -o $@ $^
    @echo done

$(objs): $(OBJDIR)/%.o : %.c
    @mkdir -p $(OBJDIR)
    gcc -c $< -o $@

不同的是,加了一個vpath,意思是告訴makefile去src2再找c檔案。

這種情況下還好,因為如果要在obj建立跟之前c檔案對應目錄的話,很好建,例如obj/src2/xxx.o,還有種情況可能就不行了:


情形2:Makefile與原始碼在同一個目錄,但要呼叫同目錄的C檔案,例如:

common

project

  -src

     --src2

  -inc

  -obj

  -Makefile

則makefile內容可以為:

OBJDIR = obj
vpath %.c src2
source = $(wildcard *.c) $(notdir $(wildcard src2/*.c)) $(notdir $(wildcard ../common/*.c))
objs = $(source:%.c=$(OBJDIR)/%.o)

all: $(objs)
    gcc -o $@ $^
    @echo done

$(objs): $(OBJDIR)/%.o : %.c
    @mkdir -p $(OBJDIR)
    gcc -c $< -o $@

這種情況下object仍然是放到同一個目錄的,但如果要在obj目錄建立相應的資料夾就不行了,例如:obj/../common/xxx.o,檔案系統報錯,因為../不是一個有效的目錄名稱。
如何在obj目錄建立obj/common/xxx.o呢?請各位思考下 :-)

相關文章