我想在linux下编译makefile。这是我的makefile
FFMPEG_LIBS= libavdevice \
libavformat \
libavfilter \
libavcodec \
libswresample \
libswscale \
libavutil \
LDLIBS := $(shell pkg-config --libs $(FFMPEG_LIBS))
LIBS = -lstdc++fs
PROJECT_ROOT = $(shell pwd)
CXX = g++
CXXFLAGS = -c -Wall
STRIP = strip
LDFLAGS =
OBJS = main.o chekfiletoconcat.o
DEPS = chekfiletoconcat.h
EXECUTABLE = concat
.PHONY: all
all: $(EXECUTABLE) $(LIBS)
$(EXECUTABLE): $(OBJS)
$(CXX) $(LDFLAGS) $^ -o $@ $(LDLIBS)
$(STRIP) $(EXECUTABLE)
%.o: %.cpp $(DEPS)
$(CXX) $(CXXFLAGS) $<
.PHONY: clean
clean:
rm -f $(OBJS) $(EXECUTABLE)
但我收到了错误的** make: * 没有规则可以使目标'-lstdc++fs','all'需要。 停止。
这一行的规则是 all
:
all: $(EXECUTABLE) $(LIBS)
翻译成:
all: concat -lstdc++fs
这就是导致该错误的原因,因为 make
不知道如何建立 -lstdc++fs
- 它毕竟是一个编译器链接器。争论 而不是一个文件。
我不认为 $(LIBS)
应该有的,有了它就更有意义了。
all: $(EXECUTABLE)
$(EXECUTABLE): $(OBJS)
$(CXX) $(LDFLAGS) $^ -o $@ $(LDLIBS) $(LIBS)
$(STRIP) $(EXECUTABLE)
换句话说,使用 $(LIBS)
标记来编译可执行文件,但 不 作为一个依赖关系。
.PHONY: all
all: $(EXECUTABLE) $(LIBS)
只要你不自己构建,你的lib有依赖关系是没有意义的。在你的例子中。$(LIBS)
做了 不 包含库文件的名称,这是必要的,从它做一个构建规则,并使其成为一个先决条件,但直接有"-lxyz "命令行选项的链接器。在Makefile中,你不能用这种格式来做deps。在你的情况下,我会简单地删除 $(LIBS)
从你的规则。
all: $(EXECUTABLE)
我做过这个
LDLIBS := $(shell pkg-config --libs $(FFMPEG_LIBS)) -lstdc++fs
all: $(EXECUTABLE)