2013-05-14 52 views
0

我已經寫了一個makefile,鏈接了幾個ffmpeg庫並編譯了一個基本的hello世界代碼段。我希望所有的目標文件和可執行文件都進入./bin文件夾。 我使用VPATH爲包括./bin目錄與.o文件的時候。 當我在make clean之後進行編譯時,第一次在鏈接步驟中嘗試從當前目錄獲取.o文件,而不是在vpath中指定的路徑。但第二次,沒有問題。鏈接步驟沒有從正確的位置獲取目標文件

我也在make文件中創建bin目錄文件夾,這可能與它有關,但是,在編譯步驟生成.o文件時,我沒有看到問題。

這裏是make文件:

ifeq (0, ${MAKELEVEL}) 
cur-dir := $(shell pwd) 
whoami := $(shell whoami) 
host-type := $(shell arch) 
endif 

CC=gcc 
CFLAGS :=-c -Wall -pthread -o $(BINDIR)/[email protected] 
LDFLAGS :=-lpthread 
FFMPEG := ${cur-dir}/ffmpeg 
FFLIBS := -lavcodec -lavdevice -lavformat 
FFLIBPATH := -L${FFMPEG}/libavcodec -L${FFMPEG}/libavdevice -L${FFMPEG}/libavformat 
SOURCES := pthreadEx.c 
OBJECTS := $(SOURCES:.c=.o) 
BINDIR := ./bin 
EXECUTABLE := micgrabber 
INCFILE := -I${FFMPEG}/libavformat \ 
      -I${FFMPEG}/libavcodec \ 
      -I${FFMPEG}/libavdevice 

vpath %.o $(BINDIR) 
all: directories $(OBJECTS) $(EXECUTABLE) 

$(EXECUTABLE): $(OBJECTS) 
    $(CC) $(LDFLAGS) $(FFLIBPATH) $(FFLIBS) $< -o $(BINDIR)/[email protected] 

pthreadEx.o: pthreadEx.c 
    $(CC) $(CFLAGS) $< -o $(BINDIR)/[email protected] 

clean: 
    rm -rf *.o 
    rm -rf $(BINDIR) 

.PHONY: directories 

directories: ${BINDIR} 

${BINDIR}: 
    mkdir -p ${BINDIR} 

我不知道爲什麼,在第一次嘗試編譯,它看起來放錯了地方的.o文件將。

以下是第一次運行make之後的輸出(包括生成的gcc命令)。

[[email protected] sf_audioProj]# make clean 
rm -rf *.o 
rm -rf ./bin 
[[email protected] sf_audioProj]# make 
mkdir -p ./bin 
gcc -c -Wall -pthread -o/pthreadEx.c -o ./bin/pthreadEx.o 
gcc -lpthread -L/media/sf_audioProj/ffmpeg/libavcodec -L/media/sf_audioProj/ffmpeg/libavdevice 
-L/media/sf_audioProj/ffmpeg/libavformat -lavcodec -lavdevice -lavformat 
pthreadEx.o -o ./bin/micgrabber 
gcc: pthreadEx.o: No such file or directory 
make: *** [micgrabber] Error 1 

在這一點上,在bin目錄已創建和編譯步驟成功並沒有在bin文件夾一個pthreadEx.o文件。但是,鏈接步驟失敗。我再次運行make,這就是我現在得到的。

[[email protected] sf_audioProj]# make 
gcc -lpthread -L/media/sf_audioProj/ffmpeg/libavcodec -L/media/sf_audioProj/ffmpeg 
/libavdevice -L/media/sf_audioProj/ffmpeg/libavformat -lavcodec -lavdevice -lavformat 
./bin/pthreadEx.o -o ./bin/micgrabber 

編譯步驟不執行,因爲對象文件存在並且是最新的,而這一次鏈接步驟源從正確的位置對象文件。

任何人都可以告訴我我的makefile中有什麼問題嗎?

+0

我沒有答案;但每當我看到它,我發現VPATH從來沒有完全達到我想要的。如今,我只有一個明確的$(OBJDIR)/遍佈我的Makefiles。 – 2013-05-14 16:02:39

+1

VPATH只要你瞭解它的宗旨的偉大工程:只有找到_source_文件(即,未通過化妝建,但預計已經存在的文件)。你應該_永遠不要使用它來嘗試找到目標文件(生成文件)。如果你遵循這個規則,VPATH不會讓你感到驚訝。當然,這意味着你不能以你上面所做的方式使用它。 – MadScientist 2013-05-14 17:04:42

回答

0

我不知道,這是整個問題,但這個規則:

pthreadEx.o: pthreadEx.c 
     $(CC) $(CFLAGS) $< -o $(BINDIR)/[email protected] 

是騙make。它說,$(CC)命令需要pthreadEx.c,它應該受vpath查找(但在這種情況下似乎沒有必要)並在當前目錄中產生pthreadEx.o(目標不會自動假定進入vpath位置)。然而,實際的命令將在pthreadEx.o$(BINDIR)

這個規則可能會更好:

$(BINDIR)/pthreadEx.o: pthreadEx.c 
     $(CC) $(CFLAGS) $< -o [email protected] 

老實說,我跟阿德里安在他的評論很以上 - 與VPATH位分配,也將讓你的規則明確。 vpath-ing可能會導致很多難以調試的各種各樣的通用性問題。