You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux下编译Makefile报错:无规则生成目标'-lstdc++fs'求助

解决Makefile中"No rule to make target '-lstdc++fs'"的错误

这个错误的根源很明确:你把LIBS = -lstdc++fs这个链接选项当成了all目标的依赖项。Make看到all: $(EXECUTABLE) $(LIBS)时,会把-lstdc++fs当作一个需要生成的文件目标,但它根本不是文件,也没有对应的构建规则,自然会抛出报错。

修复方案

你需要把-lstdc++fs合并到链接阶段的参数里,而不是作为目标依赖。具体修改如下:

  1. 移除all目标中的$(LIBS)依赖项
  2. 将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 20:17:59