OSG QT项目报错 QOpenGLContext::swapBuffers() called with non-exposed window, behavior is undefined

OSG QT项目报错QOpenGLContext::swapBuffers() called with non-exposed window, behavior is undefined

1、OSG嵌入QT界面
参考代码:原文链接OSG开发笔记(三):OSG使用osgQt嵌入Qt应用程序
配置好开发环境,新建QT界面项目,实现上述代码。

2、实现上述代码后,运行出现以下问题:
在这里插入图片描述
3 问题原因以及解决
qt 界面还没完成,osg已经开始渲染,导致帧循环出错解决。
在这里插入图片描述
上方红框内为改动内容,编译后运行成功,无报错。

<think>好的,用户遇到了一个编译错误:“undefined reference to non-virtual thunk to osgViewer::Viewer::take(osg::View&)”,在osgqt5的main.cpp中。我需要帮他解决这个问题。首先,我需要分析错误的原因。 根据用户提供的引用资料,特别是引用[3]和[4],类似的错误通常与Qt的MOC(元对象编译器)未正确生成有关。MOC负责处理Qt的信号和槽以及虚函数,如果MOC没有正确生成,会导致虚函数表的问题,从而出现“non-virtual thunk”相关的链接错误。 接下来,用户的问题涉及osgViewer::Viewer类的take方法。可能的原因包括: 1. **MOC文件未正确生成**:检查是否在构建过程中正确调用了qt5_wrap_cpp来生成MOC文件,并且这些文件被包含在源文件列表中。引用[3]中提到,需要将MOC生成的文件添加到SOURCE_FILES中。 2. **虚函数声明问题**:确保在类的头文件中正确声明了虚函数,并且使用了virtual关键字。注意,virtual关键字应放在声明处,而不是定义处。如果osgViewer::Viewer的派生类中有虚函数覆盖错误,也可能导致此问题。 3. **链接库缺失或顺序错误**:检查是否链接了所有必要的OSGQt库,并且链接顺序正确。OSG库通常需要按特定顺序链接,例如osgViewer应在osgDB之后。 4. **编译器兼容性**:确保使用的编译器与OSGQt版本兼容,特别是如果用户使用的是较新的Qt5或OSG版本,可能存在ABI兼容性问题。 5. **头文件包含问题**:确认main.cpp中正确包含了相关的头文件,比如osgViewer/Viewer和Qt的相关头文件,并且没有拼写错误或路径问题。 解决方案步骤可能包括: - **检查CMake配置**:确保在CMakeLists.txt中正确调用了qt5_wrap_cpp生成MOC文件,并将生成的MOC文件添加到可执行文件的源文件列表中,如引用[3]所示。 - **验证虚函数声明**:检查用户自定义的类是否正确地覆盖了虚函数,特别是与osgViewer::Viewer相关的部分,确保使用了virtual关键字。 - **调整链接库顺序**:在链接命令中,确保OSG的库按照正确的顺序排列,通常按照从基础到高级的顺序,比如osgosgDB、osgUtil、osgGA、osgViewer、osgQt- **清理和重新构建**:有时候旧的MOC文件或缓存可能导致问题,清理构建目录并重新生成可能解决。 同时,用户可能需要确认OSGQt5的安装是否正确,版本是否兼容,以及环境变量如LD_LIBRARY_PATH是否包含必要的库路径。如果问题依旧,可能需要查看具体的代码片段,尤其是自定义类中使用osgViewer::Viewer的部分,是否有遗漏的声明或定义。</think>### 编译错误解决方案:`undefined reference to non-virtual thunk to osgViewer::Viewer::take(osg::View&)` #### 问题分析 该错误通常与以下原因相关: 1. **MOC文件未正确生成**:Qt的元对象编译器(MOC)未正确处理虚函数表,导致符号未定义[^3][^4]。 2. **虚函数声明错误**:虚函数未在类声明中正确使用`virtual`关键字。 3. **链接库缺失或顺序错误**:缺少必要的OSGQt库,或链接顺序不当[^5]。 4. **编译器兼容性问题**:OSG库与Qt版本或编译器存在ABI不兼容。 --- #### 解决方案步骤 1. **确保MOC文件正确生成** - 在`CMakeLists.txt`中添加Qt的MOC生成命令: ```cmake find_package(Qt5 REQUIRED COMPONENTS Core Widgets) qt5_wrap_cpp(MOC_FILES include/myviz.hpp) # 替换为实际头文件 add_executable(your_project src/main.cpp ${MOC_FILES}) ``` 确保生成的MOC文件被包含在构建目标中。 - 清理并重新构建项目,避免旧缓存干扰。 2. **检查虚函数声明** - 若自定义类继承自`osgViewer::Viewer`,需在头文件中正确声明虚函数: ```cpp class MyViewer : public osgViewer::Viewer { public: virtual bool take(osg::View& view); // virtual关键字在声明处 }; ``` - **不要**在类外定义时重复使用`virtual`关键字。 3. **调整链接库顺序** - 在`CMakeLists.txt`中按顺序链接OSG库: ```cmake target_link_libraries(your_project osgViewer osgGA osgDB osgUtil osg Qt5::Core Qt5::Widgets ) ``` - 确保`osgViewer`和`osgQt`库版本与Qt5兼容。 4. **验证环境配置** - 检查OSG安装路径是否包含在`CMAKE_PREFIX_PATH`中: ```cmake set(CMAKE_PREFIX_PATH "/opt/osg;/usr/local/osg") ``` - 确认动态库路径(如`LD_LIBRARY_PATH`)包含OSGQt库。 --- #### 完整示例配置 ```cmake cmake_minimum_required(VERSION 3.10) project(osgqt5_demo) find_package(Qt5 REQUIRED COMPONENTS Core Widgets) find_package(OpenSceneGraph REQUIRED) # 生成MOC文件 qt5_wrap_cpp(MOC_FILES include/MyViewer.hpp) # 添加可执行文件 add_executable(demo src/main.cpp ${MOC_FILES} ) # 链接库(注意顺序) target_link_libraries(demo OpenSceneGraph::osgViewer OpenSceneGraph::osgGA OpenSceneGraph::osgDB OpenSceneGraph::osgUtil OpenSceneGraph::osg Qt5::Core Qt5::Widgets ) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值