我正在关注ffmpeg(http://dranger.com/ffmpeg)的精彩教程,并尝试为其构建一个通用的makefile。
我的问题是我无法为可执行文件定义一个通用规则,以便在同名的对象上使用" .o"后缀。
示例:调用时make all
我想在2个文件tutorial01
和tutorial02
中构建2个可执行文件tutorial01.cpp
和tutorial02.cpp
,但首先我想要将它们编译成*.o
然后链接它们。
我的整个Makefile是这样的:
CC=g++
CXXFLAGS="-std=c++11"
CXXFLAGS+=`sdl-config --cflags`
LDFLAGS=-L/usr/lib/x86_64-linux-gnu/
LDFLAGS+=-L/lib/x86_64-linux-gnu/
LDFLAGS+=-lavutil-ffmpeg -lavcodec-ffmpeg -lavformat-ffmpeg -lswscale-ffmpeg
LDFLAGS+=`sdl-config --libs`
SOURCES=$(wildcard *.cpp)
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLES=$(SOURCES:.cpp=)
all : $(EXECUTABLES)
# Not working:
#%$(EXECUTABLES) : $(OBJECTS)
# $(CC) $< -o $@ $(LDFLAGS) $(LD_LIBS)
#
# Not working (always substitutes the first found):
#$(EXECUTABLES) : $(OBJECTS)
# $(CC) $< -o $@ $(LDFLAGS) $(LD_LIBS)
#
# Not working:
#for exec in $(EXECUTABLES) ; do \
#$(exec) : $(exec).o ; \
#done
#
# Working:
#tutorial01:tutorial01.o
#tutorial02:tutorial02.o
#tutorial03:tutorial03.o
%: %.o
$(CC) $< -o $@ $(LDFLAGS) $(LD_LIBS)
%.o : %.cpp
$(CC) $(CXXFLAGS) -c $< -o $@
clean:
rm -rf $(OBJECTS) $(EXECUTABLES)
我尝试了上面所说的&#34;没有工作&#34;并举例说明了什么是有效的但不是通用的。
答案 0 :(得分:1)
# Not working (always substitutes the first found):
$(EXECUTABLES) : $(OBJECTS)
$(CC) $< -o $@ $(LDFLAGS) $(LD_LIBS)
此操作失败,因为$(OBJECTS)
扩展为所有目标的tutorial01.o tutorial02.o tutorial03.o
,$<
扩展为第一个先决条件,这是相同的({{ 1}})所有目标。
tutorial01.o
这失败了,因为它是用shell语法编写的for循环。您可以在Make语法中编写for循环,但这里不需要它。
我会使用pattern rule:
# Not working:
for exec in $(EXECUTABLES) ; do \
$(exec) : $(exec).o ; \
done
tutorial%: tutorial%.o
$(CC) $< -o $@ $(LDFLAGS) $(LD_LIBS)