Qt应用集成ObjectBox遇未定义引用错误求助
问题
在Qt 5.12 + MinGW 7.3环境下,往空Qt应用中集成ObjectBox,按官方指南操作后下载了win x64平台v0.17.0版本的ObjectBox-C库,但编译时出现未定义引用错误,怀疑是.pro文件链接配置问题。相关代码及错误信息如下:
.pro文件内容
QT -= gui CONFIG += c++11 console CONFIG -= app_bundle # You can make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \ main.cpp # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target win32:CONFIG(release, debug|release): LIBS += -L$$PWD/objectbox/lib/ -lobjectbox else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/objectbox/lib/ -lobjectbox INCLUDEPATH += $$PWD/objectbox/include DEPENDPATH += $$PWD/objectbox/include
main.cpp内容
#include <QCoreApplication> #include "objectbox.hpp" int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); printf("Using ObjectBox version %s\n", obx_version_string()); return a.exec(); }
编译错误信息
C:/Qt/Tools/mingw730_64/bin/mingw32-make -f Makefile.Debug mingw32-make[1]: Entering directory 'C:/temp/obxTut/ObjectBoxTutorial' g++ -c -fno-keep-inline-dllexport -g -std=gnu++11 -Wall -W -Wextra -fexceptions -mthreads -DUNICODE -D_UNICODE -DWIN32 -DMINGW_HAS_SECURE_API=1 -DQT_QML_DEBUG -DQT_CORE_LIB -I. -Iobjectbox\include -I..\..\..\Qt\5.12.11\mingw73_64\include -I..\..\..\Qt\5.12.11\mingw73_64\include\QtCore -Idebug -I..\..\..\Qt\5.12.11\mingw73_64\mkspecs\win32-g++ -o debug\main.o main.cpp In file included from main.cpp:2:0: objectbox\include/objectbox.hpp:711:21: warning: 'std::vector<long long unsigned int> obx::{anonymous}::idVectorOrThrow(OBX_id_array*)' defined but not used [-Wunused-function] std::vector<obx_id> idVectorOrThrow(OBX_id_array* cIds) { ^~~~~~~~~~~~~~~ objectbox\include/objectbox.hpp:703:14: warning: 'OBX_id_array obx::{anonymous}::cIdArrayRef(const std::vector<long long unsigned int>&)' defined but not used [-Wunused-function] OBX_id_array cIdArrayRef(const std::vector<obx_id>& ids) { ^~~~~~~~~~~ g++ -Wl,-subsystem,console -mthreads -o debug\ObjectBoxTutorial.exe debug/main.o -LC:\temp\obxTut\ObjectBoxTutorial\objectbox\lib -lobjectbox C:\Qt\5.12.11\mingw73_64\lib\libQt5Cored.a debug/main.o: In function `idVectorOrThrow': C:\temp\obxTut\ObjectBoxTutorial/objectbox/include/objectbox.hpp:712: undefined reference to `obx::internal::throwLastError(int, char const*)' C:\temp\obxTut\ObjectBoxTutorial/objectbox/include/objectbox.hpp:718: undefined reference to `obx::internal::throwIllegalStateException(char const*, char const*)' debug/main.o: In function `applyTo': C:\temp\obxTut\ObjectBoxTutorial/objectbox/include/objectbox.hpp:828: undefined reference to `obx::internal::throwIllegalStateException(char const*, char const*)' collect2.exe: error: ld returned 1 exit status mingw32-make[1]: *** [Makefile.Debug:65: debug/ObjectBoxTutorial.exe] Error 1 mingw32-make: *** [Makefile:38: debug] Error 2 mingw32-make[1]: Leaving directory 'C:/temp/obxTut/ObjectBoxTutorial' 23:05:08: The process "C:\Qt\Tools\mingw730_64\bin\mingw32-make.exe" exited with code 2. Error while building/deploying project ObjectBoxTutorial (kit: Desktop Qt 5.12.11 MinGW 64-bit) When executing step "Make"
解决方案
出现未定义引用错误的核心原因是只链接了ObjectBox的C库,但C++封装的内部辅助函数未被编译——ObjectBox的C++ API基于C库封装,部分逻辑在头文件中实现,依赖额外的cpp源文件提供支持。按以下步骤修复:
- 提取对应v0.17.0版本的ObjectBox-C++源码中的
src/objectbox.cpp文件,放到Qt项目目录下。 - 修改.pro文件,将该cpp文件添加到SOURCES列表:
SOURCES += \ main.cpp \ objectbox.cpp
- 确认下载的ObjectBox-C库是MinGW编译版本,不同编译器生成的库无法兼容,MinGW版本通常以
.a为后缀。 - 清理项目后重新执行qmake,再进行编译。
补充:早期ObjectBox的C封装未将所有逻辑打包到C库中,必须手动编译对应的cpp文件才能完成C API的链接。若问题仍存在,检查库路径是否正确,确保-L指定的目录下存在对应版本的库文件。
内容的提问来源于stack exchange,提问作者user13633679
相关产品推荐
相关产品推荐

