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

树莓派迁移至Bookworm OS编译报错:clang找不到–lreadline文件

编译错误:clang无法找到'–lreadline'文件或目录

将树莓派上可正常运行的应用迁移至最新的Bookworm操作系统时,执行make命令出现如下编译错误:

make
clang++ -lpthread -L/usr/local/lib –lreadline -lcurl -lpigpio -o build/cpssuper build/common.cpp.o build/gpio.cpp.o build/mutex.cpp.o build/namedpipe.cpp.o build/console.cpp.o build/pcs-api-task.cpp.o build/main.cpp.o build/utils.cpp.o build/datetime.cpp.o
clang: error: no such file or directory: '–lreadline'
make: *** [Makefile:40: build/cpssuper] Error 1

此前使用的readline7无法安装,已成功安装readline8及对应的开发库:

sudo apt-get install libreadline8 libreadline-dev

执行apt-cache search readline可确认相关库已存在,当前Makefile配置如下:

CC=clang
CXX=clang++
CPPFLAGS=-std=c++14 -Isrc/ -Wall -Wextra -Weffc++ -Wno-gnu-statement-expression -Wuninitialized -Wmissing-field-initializers #-Wsign-conversion
LDFLAGS = -lpthread -L/usr/local/lib –lreadline -lcurl -lpigpio
CFLAGS=

SRC_DIR ?= src
BUILD_DIR ?= build
DEP_DIR ?= .deps

TARGET ?= $(BUILD_DIR)/cpssuper

.PHONY: default all clean run

all: $(TARGET)

DEPFLAGS= -MT $@ -MMD -MP -MF $(DEP_DIR)/$*.Td

SRC_FILES := $(shell find $(SRC_DIR) -name *.cpp)
C_SRC_FILES := $(shell find $(SRC_DIR) -name *.c)
OBJ_FILES := $(patsubst $(SRC_DIR)/%.cpp, $(BUILD_DIR)/%.cpp.o, $(SRC_FILES))
C_OBJ_FILES := $(patsubst $(SRC_DIR)/%.c, $(BUILD_DIR)/%.c.o, $(C_SRC_FILES))

POST_COMPILE = @mv -f $(DEP_DIR)/$*.Td $(DEP_DIR)/$*.d && touch $@

    
$(BUILD_DIR)/%.c.o: $(SRC_DIR)/%.c $(DEP_DIR)/%.d
    @mkdir -p $(@D)
    $(CC) $(DEPFLAGS) $(CFLAGS) -c -o $@ $<
    $(POST_COMPILE)
    
$(BUILD_DIR)/%.cpp.o: $(SRC_DIR)/%.cpp $(DEP_DIR)/%.d
    @mkdir -p $(@D)
    $(CXX) $(DEPFLAGS) $(CPPFLAGS) -c -o $@ $<
    $(POST_COMPILE)

$(TARGET): $(C_OBJ_FILES) $(OBJ_FILES)
    $(CXX) $(LDFLAGS) -o $@ $^

run: $(TARGET)
    ./$(TARGET)

clean:
    -rm $(OBJ_FILES)
    -rm $(C_OBJ_FILES)

$(DEP_DIR)/%.d:
    @mkdir -p $(@D)
.PRECIOUS: $(DEP_DIR)/%.d

include $(wildcard $(patsubst $(SRC_DIR)/%.cpp, $(DEP_DIR)/%.d, $(SRC_FILES)))
include $(wildcard $(patsubst $(SRC_DIR)/%.c, $(DEP_DIR)/%.d, $(C_SRC_FILES)))

解决方案

  • 修正链接选项的符号错误
    错误提示中的–lreadline使用了长破折号(–),而clang识别的链接选项前缀是短破折号(-)。修改Makefile中LDFLAGS行的–lreadline为-lreadline:

    LDFLAGS = -lpthread -L/usr/local/lib -lreadline -lcurl -lpigpio
    
  • 调整链接顺序
    clang链接器对库的顺序敏感,依赖库必须放在需要它们的目标文件之后。修改生成目标的规则,将LDFLAGS移到目标文件列表$^之后:

    $(TARGET): $(C_OBJ_FILES) $(OBJ_FILES)
        $(CXX) -o $@ $^ $(LDFLAGS)
    
  • 优化库路径设置(可选)
    Bookworm系统中libreadline默认安装在系统标准库路径(如/usr/lib/arm-linux-gnueabihf/),若未手动编译安装readline到/usr/local/lib,可移除LDFLAGS中的-L/usr/local/lib,避免干扰系统库的查找逻辑。

验证步骤

执行以下命令重新编译:

make clean
make

内容的提问来源于stack exchange,提问作者ADL

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 09:59:50