我已經寫了一個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中有什麼問題嗎?
我沒有答案;但每當我看到它,我發現VPATH從來沒有完全達到我想要的。如今,我只有一個明確的$(OBJDIR)/遍佈我的Makefiles。 – 2013-05-14 16:02:39
VPATH只要你瞭解它的宗旨的偉大工程:只有找到_source_文件(即,未通過化妝建,但預計已經存在的文件)。你應該_永遠不要使用它來嘗試找到目標文件(生成文件)。如果你遵循這個規則,VPATH不會讓你感到驚訝。當然,這意味着你不能以你上面所做的方式使用它。 – MadScientist 2013-05-14 17:04:42