0

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

4

1 回答 1

0

我不知道这是整个问题,但这条规则:

pthreadEx.o: pthreadEx.c
        $(CC) $(CFLAGS) $< -o $(BINDIR)/$@

是在撒谎make。它说$(CC)命令需要pthreadEx.c,它应该接受 vpath 查找(但在这种情况下似乎没有必要)并pthreadEx.o在当前目录中生成(不会自动假定目标进入 vpath 位置)。但是,实际的命令pthreadEx.o放入$(BINDIR).

这条规则可能更好:

$(BINDIR)/pthreadEx.o: pthreadEx.c
        $(CC) $(CFLAGS) $< -o $@

老实说,我在上面的评论中支持 Adrian - 省去 vpath 位,只需明确您的规则即可。vpath-ing 会导致各种难以调试的一般性问题。

于 2013-05-14T16:33:10.697 回答