Makefile问题

问题描述 投票:0回答:2

我想在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'需要。 停止。

c++ makefile
2个回答
2
投票

这一行的规则是 all:

all: $(EXECUTABLE) $(LIBS)

翻译成:

all: concat -lstdc++fs

这就是导致该错误的原因,因为 make 不知道如何建立 -lstdc++fs - 它毕竟是一个编译器链接器。争论 而不是一个文件。

我不认为 $(LIBS) 应该有的,有了它就更有意义了。

all: $(EXECUTABLE)

$(EXECUTABLE): $(OBJS)
    $(CXX) $(LDFLAGS) $^ -o $@ $(LDLIBS) $(LIBS)
    $(STRIP) $(EXECUTABLE)

换句话说,使用 $(LIBS) 标记来编译可执行文件,但 作为一个依赖关系。


1
投票
.PHONY: all
all: $(EXECUTABLE) $(LIBS)

只要你不自己构建,你的lib有依赖关系是没有意义的。在你的例子中。$(LIBS) 做了 包含库文件的名称,这是必要的,从它做一个构建规则,并使其成为一个先决条件,但直接有"-lxyz "命令行选项的链接器。在Makefile中,你不能用这种格式来做deps。在你的情况下,我会简单地删除 $(LIBS) 从你的规则。

all: $(EXECUTABLE)

0
投票

我做过这个

LDLIBS := $(shell pkg-config --libs $(FFMPEG_LIBS)) -lstdc++fs
all: $(EXECUTABLE)
© www.soinside.com 2019 - 2024. All rights reserved.