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

使用GoogleTest测试时libusb库出现未定义引用问题求助

解决GoogleTest结合libusb构建时的未定义引用问题

你的问题核心是链接阶段没有正确引入libusb库,虽然你定义了LIBS变量,但在生成最终测试可执行文件的规则里并没有用到它,而且LIBS里的参数还有错误。以下是具体的修复步骤:

1. 修正Makefile的关键问题

错误点分析

  • LIBS里的-L/usr/lib/x86_64-linux-gnu/libusb-1.0.so是错误用法:-L选项是指定库文件的搜索目录,不是直接指定.so文件,这个参数应该移除,或者改为-L/usr/lib/x86_64-linux-gnu(如果系统的libusb库在这个目录下)。
  • 生成test可执行文件的规则中,没有将LIBS变量加入链接命令,导致链接器找不到libusb的实现。

修改后的完整Makefile

GTEST_DIR= /home/sahin/googletest/googletest
LIBUSB_DIR= /usr/include/libusb-1.0

USER_DIR=.
# 修正LIBS:移除错误的-L参数,保留正确的库路径和链接选项
LIBS += -L/usr/lib -L/usr/lib/x86_64-linux-gnu -lusb-1.0

CPPFLAGS += -I$(GTEST_DIR)/include -I$(LIBUSB_DIR)

CXXFLAGS += -g -Wall -Wextra -pthread

OBJECTS = main.o test.o
TESTS = test

GTEST_HEADERS = $(GTEST_DIR)/include/gtest/*.h \
                $(GTEST_DIR)/include/gtest/internal/*.h
LIBUSB_HEADERS = $(LIBUSB_DIR)/*.h

all : $(TESTS)

clean :
    rm -f $(TESTS) gtest.a gtest_main.a *.o

GTEST_SRCS_ = $(GTEST_DIR)/src/*.cc $(GTEST_DIR)/src/*.h $(GTEST_HEADERS)

gtest-all.o : $(GTEST_SRCS_)
    $(CXX) $(CPPFLAGS) -I$(GTEST_DIR) $(CXXFLAGS) -c \
            $(GTEST_DIR)/src/gtest-all.cc

gtest_main.o : $(GTEST_SRCS_)
    $(CXX) $(CPPFLAGS) -I$(GTEST_DIR) $(CXXFLAGS) -c \
            $(GTEST_DIR)/src/gtest_main.cc

gtest.a : gtest-all.o
    $(AR) $(ARFLAGS) $@ $^

gtest_main.a : gtest-all.o gtest_main.o
    $(AR) $(ARFLAGS) $@ $^

test.o : $(USER_DIR)/test.cpp $(GTEST_HEADERS) $(LIBUSB_HEADERS)
    # 新增LIBUSB_HEADERS依赖,确保头文件变化时重新编译
    $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/test.cpp

test : test.o gtest_main.a
    # 加入$(LIBS)到链接命令末尾,链接器需要先看目标文件再找库
    $(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $^ $(LIBS) -o $@

2. 关键修改说明

  • 修正LIBS参数:把错误的.so文件路径从-L选项中移除,只保留库的搜索目录,最后用-lusb-1.0指定要链接的库。
  • 链接时引入LIBS:在生成test可执行文件的命令末尾添加$(LIBS),链接器的参数顺序很重要——目标文件和静态库要放在前面,动态库放在后面,这样链接器才能正确解析依赖。
  • 新增头文件依赖:给test.o的规则添加$(LIBUSB_HEADERS)依赖,确保当libusb头文件更新时,会重新编译test.cpp。

3. 验证修复

执行以下命令重新构建:

make clean
make

如果还有问题,可以检查:

  • libusb库是否真的安装在/usr/lib或/usr/lib/x86_64-linux-gnu目录下,可以用find /usr -name libusb-1.0.so命令确认路径。
  • 你的test.cpp中是否正确包含了libusb的头文件:#include <libusb-1.0/libusb.h>(因为你的LIBUSB_DIR是/usr/include/libusb-1.0,所以包含路径要对应)。

内容的提问来源于stack exchange,提问作者Şahin Şengül

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 23:15:44