makefile - 在构建许多可执行文件时使用对象定义依赖关系

时间:2016-02-03 07:33:31

标签: makefile gnu-make

我正在关注ffmpeg(http://dranger.com/ffmpeg)的精彩教程,并尝试为其构建一个通用的makefile。

我的问题是我无法为可执行文件定义一个通用规则,以便在同名的对象上使用" .o"后缀。

示例:调用时make all我想在2个文件tutorial01tutorial02中构建2个可执行文件tutorial01.cpptutorial02.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;并举例说明了什么是有效的但不是通用的。

1 个答案:

答案 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

static pattern rule

tutorial%: tutorial%.o
    $(CC) $< -o $@ $(LDFLAGS) $(LD_LIBS)