0x000007FECAC83B1B (osg160-osgd.dll)处(位于 foo.exe 中)引发的异常: 0xC0000005: 读取位置 0x0000000000000028 时发生访问冲...

在qt和osg的项目中使用osgQOpenGLWidget时可能发生如下的异常:
0x000007FECAC83B1B (osg160-osgd.dll)处(位于 foo.exe 中)引发的异常: 0xC0000005: 读取位置 0x0000000000000028 时发生访问冲突。
其实原因很简单,在初始化osgQOpenGLWidget时应该传入main函数命令行参数,即
auto widget = new osgQOpenGLWidget(&argument)
这样处理就ok啦。

转载于:https://www.cnblogs.com/ljy339/p/10904763.html

<think>我们正在理一个关于OSG(OpenSceneGraph)的DLL文件问题。用户在使用VS2019 x64编译或运行OSG 3.7.0遇到了`osg202-osgd.dll`相关的问题。根据引用内容,我们可以推断用户可能遇到了以下情况之一: 1. 缺少`osg202-osgd.dll`文件(或类似名称的DLL,注意版本号可能不同) 2. DLL文件版本不匹配或损坏 3. 插件路径配置不正确 注意:在引用中提到了`osgdb_osgd.dll`(引用[1])和`osgPlugins`目录(引用[3]),这提示我们DLL文件通常位于插件目录中。另外,引用[2]提到解决类似问题的方法是将所需的DLL复制到可执行文件目录(如`C:/OSG/bin`)或系统路径中。 根据引用[3],`osgDB::readNodeFile()`函数依赖于插件目录中的DLL读取不同格式的文件。因此,确保插件目录正确设置且包含所需的DLL至关重要。 另外,引用[4]和[5]提到了在VS2019中编译OSG3.7.0的注意事项,这可能是用户自己编译OSG遇到的配置问题。 由于用户具体问题描述中提到了`osg202-osgd.dll`,这个文件名中的“202”可能是版本号(如对应OSG 2.2?),但用户使用的是OSG 3.7.0,因此可能是版本不匹配导致的。在OSG 3.7.0中,插件DLL的命名方式可能已经改变,例如可能为`osgdb_osg.dll`和`osgdb_osgd.dll`(其中'd'代表debug版本)。 因此,解决方案可能包括: 1. 确保正确编译了OSG(包括插件),并将生成的DLL放在正确的位置。 2. 配置环境变量或OSG文件路径,使程序能够找到插件目录。 具体步骤: **步骤1:确认DLL的存在和位置** - 在编译OSG后,插件DLL应该位于构建目录下的`bin/osgPlugins-3.7.0`目录中(具体路径取决于你的安装)。请检查该目录下是否有`osgdb_osg.dll`和`osgdb_osgd.dll`(debug版本)文件。 - 注意:在OSG 3.7.0中,可能没有名为`osg202-osgd.dll`的文件,这可能是旧版本的文件名。因此,用户可能需要确认使用的文件名是否正确,或者是否使用了错误的版本。 **步骤2:设置环境变量** -OSG插件的路径(即包含`osgPlugins-3.7.0`目录的路径)添加到系统的PATH环境变量中,或者将所需的DLL复制到应用程序的可执行文件目录(如`C:/OSG/bin`,如引用[2]所述)。 - 另外,可以通过设置环境变量`OSG_LIBRARY_PATH`来指定插件目录。例如,如果插件目录是`D:\OSG\build\bin\osgPlugins-3.7.0`,则将该路径添加到`OSG_LIBRARY_PATH`中。 **步骤3:在代码中设置插件路径** - 如果环境变量设置不方便,可以在应用程序中通过代码设置插件路径。例如: ```cpp #include <osgDB/Registry> osgDB::Registry::instance()->setLibraryFilePathList("D:/OSG/build/bin/osgPlugins-3.7.0"); ``` **步骤4:检查依赖的第三方库** - 引用[2]提到缺少`zlib.dll`和`zlibd.dll`,这表明第三方库的DLL也可能缺失。请确保所有依赖的第三方库(如zlib)的DLL也在可执行文件路径或系统PATH中。 **步骤5:重新编译OSG** - 如果上述步骤无效,可能是编译过程不完整。请参考引用[4]和[5]重新编译OSG,特别注意: - 在CMake配置阶段,确保勾选了`BUILD_OSG_PLUGINS_BY_DEFAULT`(默认是勾选的)以构建所有插件。 - 确保在编译选择了正确的配置(Debug/Release)并生成了对应的DLL。 **步骤6:检查文件路径中的空格和特殊字符** - 确保OSG的安装路径和插件路径中没有空格或特殊字符,这有会导致加载失败。 **步骤7:使用Dependency Walker工具** - 使用Dependency Walker(或类似工具)检查`osg202-osgd.dll`的依赖关系,看是否有其他缺失的DLL。 根据引用[1]的错误信息,动态库加载失败,所以重点检查文件是否存在、路径是否正确以及依赖是否满足。 总结解决方案: 1. 确认正确的插件目录,并确保该目录下有`osgdb_osg.dll`和`osgdb_osgd.dll`(对于OSG 3.7.0)。 2. 将插件目录添加到PATH环境变量或设置`OSG_LIBRARY_PATH`环境变量。 3. 确保所有第三方依赖DLL(如zlib)可用。 4. 如果问题仍然存在,重新编译OSG并确保生成插件。 注意:用户提到的`osg202-osgd.dll`可能是旧版本的文件名,在OSG 3.7.0中,插件DLL的命名规则可能已经改变,因此请使用正确的文件名。 如果用户是自己编译的,请确保在CMake配置中正确设置了插件生成选项,并编译了Debug和Release版本(如果需要)。 最后,如果用户是从其他地方获取的预编译二进制文件,请确保其OSG 3.7.0版本匹配,并且是用于x64平台的。 相关问题: 1. 如何设置OSG的插件路径? 2. OSG编译过程中如何确保生成所有插件? 3. 如何解决OSG运行缺少第三方库(如zlib)的问题?</think>### OSG202-osgd.dll 文件问题解决方案(VS2019 x64 + OSG 3.7.0) #### 问题原因分析 1. **文件命名混淆** OSG 3.7.0 的插件命名规范为 `osgdb_osg.dll`(Release版)和 `osgdb_osgd.dll`(Debug版)。`osg202-osgd.dll` 可能是旧版(如2.2版本)的文件名[^3][^5]。 2. **插件路径配置错误** OSG运行需通过 `OSG_LIBRARY_PATH` 环境变量或代码配置插件目录,否则无法加载 `.osg` 格式文件[^1][^3]。 3. **依赖库缺失** 缺少基础依赖库(如zlib.dll),会导致插件加载失败[^2]。 --- #### 完整解决步骤 1. **确认插件文件存在** - 检查编译生成的插件目录(默认:`<OSG_BUILD_DIR>\bin\osgPlugins-3.7.0`) - 确认存在以下文件: - `osgdb_osg.dll`(Release版) - `osgdb_osgd.dll`(Debug版) *注:若只有旧版 `osg202-osgd.dll`,需重新编译OSG[^5]* 2. **配置环境变量** ```powershell # 添加系统环境变量 setx OSG_LIBRARY_PATH "<Your_OSG_Build_Path>\bin\osgPlugins-3.7.0" setx PATH "%PATH%;<Your_OSG_Build_Path>\bin;<3rdParty_Bin_Path>" ``` *替换 `<Your_OSG_Build_Path>` 为实际路径(如 `D:\OSG\build`)[^3][^5]* 3. **代码中显式设置插件路径** ```cpp #include <osgDB/Registry> // 在main函数初始化添加 osgDB::Registry::instance()->setLibraryFilePathList( "D:/OSG/build/bin/osgPlugins-3.7.0;" + osgDB::Registry::instance()->getLibraryFilePathList() ); ``` 4. **解决依赖库缺失** - 将第三方库的DLL(如 `zlibd.dll`, `libtiffd.dll`)复制到: - OSG的 `bin` 目录 - 或应用程序输出目录 *路径参考:`<3rdParty>\x64\bin`[^2]* 5. **重新编译注意事项** - CMake配置启用: ```cmake BUILD_OSG_PLUGINS_BY_DEFAULT=ON CMAKE_BUILD_TYPE=Release/Debug # 项目配置一致 ``` - 修复头文件冲突(VS2019特有): 编辑 `osgQOpenGLWidget.h`,取消 `#define _gl_h` 的注释[^4] --- #### 验证方法 ```cpp // 检查插件加载状态 auto* reg = osgDB::Registry::instance(); std::cout << "插件路径: " << reg->getLibraryFilePathList() << std::endl; std::cout << "已加载插件: " << reg->getReaderWriterList() << std::endl; ``` 成功应输出包含 `osgdb_osg(d).dll` 的插件列表[^3]。 #### 典型错误排查 | 错误现象 | 解决方案 | |---------|---------| | `failed loading osgdb_osgd.dll` | 检查环境变量 `OSG_LIBRARY_PATH` 是否包含插件目录[^1] | | `缺少zlibd.dll` | 复制依赖库到 `OSG/bin` 目录[^2] | | 文件格式不支持 | 确认 `osgdb_osg.dll` 在插件目录[^3] | | 运行崩溃 | Debug/Release配置混用(Debug用`osgdb_osgd.dll`)[^5] | > **关键提示**:OSG 3.7.0 不再使用 `osg202-osgd.dll` 命名规范,若存在此文件说明版本不匹配,建议重新编译[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值