将依赖libusb-1.0的C++库从arm32迁移到arm64时遇链接错误
问题描述
我有一个依赖libusb-1.0的C++库,在arm32设备上运行正常,迁移到arm64设备时遇到以下问题:
- 修改库的Makefile中libusb-1.0.so的
-L路径适配架构后,库编译成功; - 编译使用该库的arm64程序时,出现所有libusb方法的
undefined reference错误; - 已确认arm64系统安装了libusb-1.0-0-dev,版本与arm32环境一致。
错误信息
/usr/bin/ld: ./libExample.so: undefined reference to `libusb_get_config_descriptor' /usr/bin/ld: ./libExample.so: undefined reference to `libusb_open' /usr/bin/ld: ./libExample.so: undefined reference to `libusb_get_device_list' /usr/bin/ld: ./libExample.so: undefined reference to `libusb_clear_halt' /usr/bin/ld: ./libExample.so: undefined reference to `libusb_exit' /usr/bin/ld: ./libExample.so: undefined reference to `libusb_free_device_list' /usr/bin/ld: ./libExample.so: undefined reference to `libusb_get_device'
库的Makefile(已更新LDFLAGS)
CC = g++ RM = rm -r CFLAGS = -fPIC -g -Wall LIBS = -lusb-1.0 LDFLAGS = -L/usr/lib/aarch64-linux-gnu INCLUDE = TRG_DIR = ./out TARGET = libExample.so SRC_DIR = ./ SOURCES = $(shell ls $(SRC_DIR)/*.cpp) OBJ_DIR = ./obj OBJECTS = $(subst $(SRC_DIR),$(OBJ_DIR), $(SOURCES:.cpp=.o)) VSCRIPT = $(TARGET): $(OBJECTS) @if [ ! -d $(TRG_DIR) ]; \ then echo "mkdir -p $(TRG_DIR)"; mkdir -p $(TRG_DIR); \ fi $(CC) -fPIC -shared $(LDFLAGS) $(LIBS) -o $(TRG_DIR)/$@ $^ $(VSCRIPT) $(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp @if [ ! -d $(OBJ_DIR) ]; \ then echo "mkdir -p $(OBJ_DIR)"; mkdir -p $(OBJ_DIR); \ fi $(CC) -c $(CFLAGS) -o $@ $^
程序的Makefile(引用该库)
LIBS = -lExample LDFLAGS = -L.
请问我遗漏了什么?
解决方案
问题核心在于链接顺序错误和动态库依赖传递缺失,具体修正如下:
1. 修正库的Makefile链接参数顺序
链接器会按参数顺序解析符号,依赖库必须放在被依赖的目标文件之后。当前库的Makefile中$(LIBS)(-lusb-1.0)放在了目标文件$^前面,导致链接器先处理libusb库时没有需要解析的符号,后续处理目标文件时找不到libusb的方法。
修改库的Makefile中链接命令:
$(CC) -fPIC -shared $(LDFLAGS) -o $(TRG_DIR)/$@ $^ $(LIBS) $(VSCRIPT)
将$(LIBS)移到$^之后。
2. 强制检查未定义符号(可选但推荐)
在库的Makefile的LDFLAGS中添加-Wl,--no-undefined参数,编译库时直接检查未解析符号,避免问题延迟到上层程序编译时暴露:
LDFLAGS = -L/usr/lib/aarch64-linux-gnu -Wl,--no-undefined
3. 程序Makefile显式链接libusb(备选方案)
如果库的依赖未正确嵌入,上层程序编译时需要显式链接libusb-1.0:
LIBS = -lExample -lusb-1.0 LDFLAGS = -L. -L/usr/lib/aarch64-linux-gnu
内容的提问来源于stack exchange,提问作者erik7854
相关产品推荐
相关产品推荐

