【发布时间】:2013-05-14 15:58:05
【问题描述】:
我编写了一个链接到几个 ffmpeg 库的 makefile,并编译了一段基本的 hello world 代码。我希望所有目标文件和可执行文件进入 ./bin 文件夹。 在处理 .o 文件时,我使用 vpath 来包含 ./bin 目录。 当我在 make clean 之后编译时,第一次,在链接步骤中,它尝试从当前目录获取 .o 文件,而不是 vpath 中指定的路径。但是第二次,没有问题。
我还在 make 文件中创建了 bin 目录文件夹,这可能与它有关,但是,当它生成 .o 文件时,我在编译步骤中没有看到问题。
这是制作文件:
ifeq (0, ${MAKELEVEL})
cur-dir := $(shell pwd)
whoami := $(shell whoami )
host-type := $(shell arch )
endif
CC=gcc
CFLAGS :=-c -Wall -pthread -o $(BINDIR)/$@
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)/$@
pthreadEx.o: pthreadEx.c
$(CC) $(CFLAGS) $< -o $(BINDIR)/$@
clean:
rm -rf *.o
rm -rf $(BINDIR)
.PHONY: directories
directories: ${BINDIR}
${BINDIR}:
mkdir -p ${BINDIR}
我不确定为什么在第一次尝试编译时,它会在错误的位置查找 .o 文件。
这是第一次运行 make 后的输出(包括生成的 gcc 命令)。
[root@KartikCentOSVM sf_audioProj]# make clean
rm -rf *.o
rm -rf ./bin
[root@KartikCentOSVM 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,这就是我现在得到的。
[root@KartikCentOSVM 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 从来没有完全按照我的意愿去做。现在,我的 Makefile 中只有一个明确的 $(OBJDIR)/。
-
VPATH 只要您了解它的用途,它就可以很好地工作:它只能定位 source 文件(即,不是由 make 构建但预计已经存在的文件)。您应该从不使用它来尝试定位目标文件(make 生成的文件)。如果你遵循这条规则,VPATH 不会让你感到惊讶。当然,这意味着你不能像上面那样使用它。
标签: makefile