Qt5.15.2搭配Ogre13.1.1使用ApplicationContextQt编译示例报错如何解决
报错原因
- 缺少静态链接宏定义:你使用的是静态编译版本的Ogre,但Qt项目中没有声明
OGRE_STATIC宏,导致Ogre头文件识别为动态链接模式,符号导出标记不匹配,出现未定义引用错误。 - 库链接顺序错误:MinGW静态链接时依赖库要放在被依赖库的后面,你当前的配置中将核心库
OgreMainStatic放在了依赖它的Bites、渲染系统等库之后,链接器无法解析依赖符号。 - SDL2链接方式错误:配置中写的
-lSDL2.dll是动态链接写法,静态链接SDL2应使用-lSDL2。 - 构建类型不匹配:Qt使用Debug构建,若你编译的Ogre静态库是Release版本,两者的MinGW运行时不兼容,也会触发链接报错。
修复方案
1. 修改.pro项目配置
添加静态宏定义、调整库链接顺序,修改后配置如下:
INCLUDEPATH += "E:\ProgramFiles\ogre-13.1.1\include\OGRE" INCLUDEPATH += "E:\ProgramFiles\ogre-13.1.1\include\OGRE\Bites" INCLUDEPATH += "E:\ProgramFiles\ogre-13.1.1\include\OGRE\RTShaderSystem" # 新增静态编译宏定义 DEFINES += OGRE_STATIC LIBS += -L"E:\ProgramFiles\ogre-13.1.1\lib" LIBS += -L"E:\ProgramFiles\ogre-13.1.1\lib\OGRE" # 调整链接顺序:核心库在前,依赖库在后,系统库在最后 LIBS += -lOgreMainStatic LIBS += -lOgreBitesQtStatic -lOgreBitesStatic LIBS += -lRenderSystem_GL3PlusStatic -lOgreGLSupportStatic -lOgreMeshLodGeneratorStatic -lOgreOverlayStatic -lOgrePagingStatic -lOgrePropertyStatic -lOgreRTShaderSystemStatic -lOgreVolumeStatic LIBS += -lPlugin_BSPSceneManagerStatic -lPlugin_DotSceneStatic -lPlugin_OctreeSceneManagerStatic -lPlugin_OctreeZoneStatic -lPlugin_ParticleFXStatic -lPlugin_PCZSceneManagerStatic -lRenderSystem_GLES2Static -lRenderSystem_GLStatic LIBS += -lOgreTerrainStatic -lCodec_STBIStatic -lzlibstatic LIBS += -lSDL2main -lSDL2 -lfreetype -lpugixml LIBS += -lopengl32 -lgdi32
2. 对齐构建类型
确认Ogre 13.1.1的编译配置和Qt工程一致:如果Ogre是MinGW 32位Release版本,将Qt工程切换为Release构建;如果Ogre是Debug版本,保持Qt当前Debug构建即可。
3. 修正代码逻辑
补充输入监听注册、调整事件循环顺序,修改后main.cpp代码如下:
#include "Ogre.h" #include "OgreApplicationContextQt.h" #include <QGuiApplication> class MyTestApp : public OgreBites::ApplicationContextQt, public OgreBites::InputListener { public: MyTestApp(); void setup(); bool keyPressed(const OgreBites::KeyboardEvent& evt); }; MyTestApp::MyTestApp() : OgreBites::ApplicationContextQt("OgreTutorialApp") { } bool MyTestApp::keyPressed(const OgreBites::KeyboardEvent& evt) { if (evt.keysym.sym == OgreBites::SDLK_ESCAPE) { getRoot()->queueEndRendering(); QGuiApplication::quit(); } return true; } void MyTestApp::setup(void) { OgreBites::ApplicationContextQt::setup(); // 注册输入监听器,触发按键回调 addInputListener(this); } int main(int argc, char *argv[]) { QGuiApplication qapp(argc, argv); MyTestApp app; app.initApp(); // 使用Qt事件循环驱动,ApplicationContextQt会自动处理Ogre渲染 return qapp.exec(); }
内容的提问来源于stack exchange,提问作者8Observer8
相关产品推荐
相关产品推荐

