我编写了一个链接到几个 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 有什么问题?