Linux下编译Makefile报错:无规则生成目标'-lstdc++fs'求助
解决Makefile中"No rule to make target '-lstdc++fs'"的错误
这个错误的根源很明确:你把LIBS = -lstdc++fs这个链接选项当成了all目标的依赖项。Make看到all: $(EXECUTABLE) $(LIBS)时,会把-lstdc++fs当作一个需要生成的文件目标,但它根本不是文件,也没有对应的构建规则,自然会抛出报错。
修复方案
你需要把-lstdc++fs合并到链接阶段的参数里,而不是作为目标依赖。具体修改如下:
- 移除
all目标中的$(LIBS)依赖项 - 将
LIBS的内容合并到LDLIBS或者LDFLAGS中(推荐合并到LDLIBS,因为它专门用于存放库链接参数)
修改后的完整Makefile:
FFMPEG_LIBS= libavdevice \ libavformat \ libavfilter \ libavcodec \ libswresample \ libswscale \ libavutil \ LDLIBS := $(shell pkg-config --libs $(FFMPEG_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) $(EXECUTABLE): $(OBJS) $(CXX) $(LDFLAGS) $^ -o $@ $(LDLIBS) $(STRIP) $(EXECUTABLE) %.o: %.cpp $(DEPS) $(CXX) $(CXXFLAGS) $< .PHONY: clean clean: rm -f $(OBJS) $(EXECUTABLE)
补充说明
LDLIBS是Make的内置变量,专门用于传递链接时需要的库参数,把-lstdc++fs加在这里是最规范的做法- 如果你更倾向于保留
LIBS变量,也可以改成LDLIBS += $(LIBS),同时移除all目标里的$(LIBS)依赖,效果是完全一致的
内容的提问来源于stack exchange,提问作者Orest
相关产品推荐
相关产品推荐

