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

将依赖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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 22:35:09