树莓派迁移至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
相关产品推荐
相关产品推荐

