使用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
相关产品推荐
相关产品推荐

