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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 22:54:00