いくつかの ffmpeg ライブラリにリンクし、基本的な hello world のコードをコンパイルする makefile を作成しました。すべてのオブジェクト ファイルと実行可能ファイルを ./bin フォルダーに入れます。.o ファイルを扱うときは、vpath を使用して ./bin ディレクトリを含めます。make clean の後でコンパイルすると、最初のリンク ステップで、vpath で指定されたパスではなく、現在のディレクトリから .o ファイルを取得しようとします。2回目ですが、問題ありません。
また、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
オブジェクト ファイルが存在し、最新であるため、コンパイル手順は実行されません。今回は、リンク手順によって正しい場所からオブジェクト ファイルが取得されます。
私のメイクファイルで何が間違っているのか誰か教えてもらえますか?