简介:面向Ogre 3D图形渲染引擎初学者与需要搭建开发环境的C++开发者,这份配置文档围绕Ogre SDK在Visual Studio 2010下的完整环境搭建展开,重点解决环境变量、依赖库、示例运行与项目属性设置等常见问题。资源包仅含1个docx文件,约67KB,内容紧凑,便于离线查阅和按需对照。已有141人学习下载,说明其对入门配置场景具有一定参考价值。文档覆盖SDK安装与编译、Boost与DirectX依赖、Debug/Release链接库区分、示例程序验证及工程属性配置等关键环节,并给出路径与参数示例,可帮助读者快速定位配置错误、减少反复试错,适合作为Ogre入门阶段的环境配置手册与排错参考。
1. 为什么还要折腾 OGRE 1.7.3:一套老 SDK 的落地价值
接手一批 ogre 1.7.3 时代的老渲染工程,卡住人的往往不是渲染管线,而是环境本身:SDK 解包多套了一层目录、D3DX9_43.dll满盘找不到、属性页里一串$(OGRE_HOME)宏不知道最终展开成什么、Debug 编过 Release 一链接就红。这套 SDK 的价值不在新,而在它是一条能跑起来的最短路径——解包、编译、配属性页,三步之后就能看到那个熟悉的 Direct3D9 渲染子系统选择框。适合三类人:要给老课件或老 demo 做交接的、要在离线环境里复现一份可编译渲染工程的、以及刚接触 Ogre 想先看见窗口再读代码的。下面按环境铺底、SDK 编译产物归位、VS2010 属性页逐项落地、排错四条线拆开讲。
2. 环境铺底:SDK 抽取、DirectX9 运行库与 OGRE_HOME
先把地基打平。这一步看着最没技术含量,但后面九成的链接错误和启动闪退都能追到这三件事上:解包层级错一层、运行库少一个 dll、环境变量写成了带尾斜杠的路径。我的习惯是先花十分钟把目录结构、dll 位置和变量展开值全部确认一遍,再动手开 VS。
2.1 SDK 解包的目录层级确认
OgreSDK_vc10_v1-7-3.exe本质是个自解压包,双击后选目标目录,它会自己再建一层同名目录。也就是说你填D:\Ogre,最终得到的是D:\Ogre\OgreSDK_vc10_v1-7-3,而不是D:\Ogre\bin。这一层差异直接决定了OGRE_HOME该指到哪,指错了后面所有$(OGRE_HOME)\include全部失效。
解包完成后先别急着开工程,用两条命令把结构确认清楚:
:: 第一层:应该只有一个 OgreSDK_vc10_v1-7-3 目录 dir /b D:\Ogre :: 第二层:必须能同时看到 bin、include、lib、Samples、boost_1_44 和 Ogre.sln dir /b D:\Ogre\OgreSDK_vc10_v1-7-3第一条命令是防"多套一层",有些人手动解压时把内容又摊平了一遍,结果变成D:\Ogre\OgreSDK_vc10_v1-7-3\OgreSDK_vc10_v1-7-3。第二条命令是验收,bin、include、lib三个目录同时存在,才说明这一层就是OGRE_HOME该指向的根。少了boost_1_44,说明包不完整,得重新解压。
盘符这件事要提前定死。原料里全用D:\,一旦你的机器只有 C 盘,或者 D 盘空间不够改成 E 盘,属性页里那些硬编码的绝对路径就得逐条改。稳妥做法是统一用一个宏,所有路径都从$(OGRE_HOME)派生,这样换盘只改变量值一处。
提示:解包路径里不要出现空格和中文。Ogre 的示例工程里有若干脚本和 cfg 文件按原样拼接路径,遇到空格容易在后期生成事件那一步断掉。
2.2 D3DX9_43.dll 缺失的真实原因
Ogre 1.7.3 的 Direct3D9 渲染插件和一部分示例,依赖 DirectX 9.0c 里的 D3DX 辅助库,具体到这个版本就是d3dx9_43.dll。机器上装了更新的 DirectX 或者只装了系统自带的运行库,都不代表这个文件在——D3DX 系列是按月份版本号分发的独立运行库,缺了就缺了。
正规做法是装一遍 DirectX 最终用户运行时,它会把这批 dll 一并注册到位。但离线机器上更常见的应急做法是直接把 dll 拷进系统目录:
:: 32 位系统只需要 System32;64 位系统两个目录都要放,SysWOW64 是给 32 位进程用的 copy "D:\Ogre\d3dx9_43.dll" "C:\Windows\System32\" /y copy "D:\Ogre\d3dx9_43.dll" "C:\Windows\SysWOW64\" /y/y是覆盖确认,避免每条都弹一次询问。这里有个血泪经验:64 位 Windows 上只拷System32是最常见的翻车点。VS2010 默认生成的是 32 位 Win32 程序,它加载 dll 时走的是SysWOW64那套重定向路径,System32里放了也不认。
判断 dll 到底缺没缺,不要靠双击 exe 猜。用 VS2010 自带的依赖查看工具打开SamplesBrowser.exe,或者直接跑起来看Ogre.log里D3D9RenderSystem那一段有没有加载失败的记录,比反复重装运行库快得多。
2.3 OGRE_HOME 的写法与三条验证
环境变量这一步,错误集中在三个地方:值带了尾斜杠、写进了系统变量但当前用户权限不够、写完不重启 VS。值必须指向含bin、include、lib的那一层,末尾不加\。
图形界面那条路是:右键计算机 → 属性 → 高级系统设置 → 环境变量 → 用户变量新建OGRE_HOME。命令行等价写法:
:: 写用户变量,避免动系统级配置;引号内是值,不要带尾部反斜杠 setx OGRE_HOME "D:\Ogre\OgreSDK_vc10_v1-7-3" :: 验证一:新开一个 cmd 窗口,确认变量已生效 echo %OGRE_HOME% :: 验证二:确认 bin 下确实有可执行文件 dir /b %OGRE_HOME%\bin\debug\*.exe :: 验证三:确认 lib 下的库文件名,后面配附加依赖项要用 dir /b %OGRE_HOME%\lib\debug\OgreMain*.libsetx只影响之后新开的进程,当前已经打开的 cmd 窗口和 VS 都不会刷新。所以顺序必须是:先设变量,再开 VS。如果 VS 已经开着,改完变量得整个关掉重开,光重启解决方案没用——环境变量是在进程启动时读进内存的。
第三条验证别跳过。lib\debug下到底是OgreMain_d.lib还是OgreMain_d.lib外加一堆OgreMain_d.exp、OgreMain_d.pdb,直接影响你后面填附加依赖项时会不会手抖写错名字。顺手把这几个文件名记下来,第 4 章要反复用到。
3. 编译 Ogre.sln:Boost 依赖、并行生成与 cthugha 归位
SDK 自带的Ogre.sln能不能一次编过,取决于 Boost 路径和输出目录两件事。这一章的目标很明确:编出SamplesBrowser.exe并且能进场景。中间会有一次耗时较长的全量生成,趁这个时间把后面对属性页要用的路径都对一遍,效率最高。
3.1 Boost 1.44 的复制位置与 BOOST_ROOT
SDK 里已经带了boost_1_44,但 Ogre 的部分工程文件按固定路径去找 Boost,常见做法是把它放到C:\Program Files\boost\下面。这一步容易被忽略的原因是:不放也能编过一部分工程,等到某个依赖 Boost 头文件的示例报"无法打开源文件 boost/xxx.hpp"时,人已经懵了。
:: 建目录并整棵复制,/E 含空目录,/I 目标不存在时自动创建,/Y 静默覆盖 mkdir "C:\Program Files\boost" xcopy "D:\Ogre\OgreSDK_vc10_v1-7-3\boost_1_44" "C:\Program Files\boost\boost_1_44" /E /I /Y :: 同时补一个 BOOST_ROOT,后面属性页里可以直接引用 setx BOOST_ROOT "C:\Program Files\boost\boost_1_44"这里有个权限坑:C:\Program Files默认需要管理员权限才能写。普通账户下mkdir会直接失败,但失败信息一闪而过,很容易以为复制成功了。稳妥做法是用管理员身份开 cmd 执行,或者干脆放到D:\boost并把BOOST_ROOT指过去,Ogre 认的是环境变量和工程里的相对路径,不认死Program Files。
复制完抽查一下:C:\Program Files\boost\boost_1_44下应该能看到boost子目录(里面是海量.hpp)和lib子目录。只看到一层boost_1_44而里面还是boost_1_44,说明 xcopy 的层级搞错了,多套了一层。
3.2 生成解决方案:配置组合与并行参数
打开Ogre.sln,先在配置管理器里确认 Debug 和 Release 两个配置都要编。很多人只编 Debug,结果到第 4 章配 Release 附加依赖项时发现lib\release是空的,又得回来重编一遍。
图形界面下的操作是右键解决方案 → 生成解决方案,慢在单线程。想快一点,用 VS2010 命令提示符走 msbuild:
:: 必须在 VS2010 命令提示符里跑,普通 cmd 找不到 msbuild :: /m:4 表示最多 4 个工程并行编译,按 CPU 核数调,别超过物理核数 msbuild Ogre.sln /p:Configuration=Debug /p:Platform=Win32 /m:4 /v:minimal :: Release 单独再跑一次,两个配置的产物互不复用 msbuild Ogre.sln /p:Configuration=Release /p:Platform=Win32 /m:4 /v:minimal/p:Configuration决定编哪套配置,写错成Debug|x64之类的组合会直接报平台不匹配,因为这个 SDK 只提供 Win32。/v:minimal是把输出压到只显示警告和错误,全量日志刷屏时根本看不清第一个错误在哪——而编译这种事,永远只需要看第一个错误。
并行数不是越大越好。Ogre 的示例工程之间有隐式依赖(示例插件依赖主引擎的 lib),并行过头会出现"找不到 OgreMain_d.lib"这种伪错误,实际上是主引擎还没编完。遇到这类报错,先把/m去掉串行跑一遍确认是不是并行引发的。
3.3 cthugha 输出目录的识别与 bin\debug 归位
全量生成跑完之后,除了bin\debug里多出的一堆 exe 和 dll,D 盘根下还可能多出一个cthugha目录。这是 SDK 里那个示例插件工程的输出目录,工程文件里的输出路径是相对路径,跟随解决方案目录算下来就落到了盘符根下。它编出来的 dll 不归位,SamplesBrowser里对应的示例就打不开。
:: 先确认到底生成了什么,别盲目覆盖 dir /b D:\cthugha\Debug :: 把产物整体搬到 bin\debug,/Y 覆盖同名文件 xcopy "D:\cthugha\Debug\*" "%OGRE_HOME%\bin\debug\" /E /I /Y/E保证子目录一起搬,/I防止目标被当成文件,/Y静默覆盖。覆盖这一步不要心疼,bin\debug里同名的旧文件如果留着,很容易出现"改了代码但跑的还是老 dll"的玄学现象。
如果 D 盘没有cthugha目录,先别急着怀疑自己少做了什么。检查生成日志里有没有这个工程的编译记录,有可能是这个工程没被勾选生成。在解决方案里找到它,单独右键生成一次,再看输出路径。
3.4 SamplesBrowser.exe 作为第一道验收
到这一步,%OGRE_HOME%\bin\debug\SamplesBrowser.exe应该能双击起来,弹出那个渲染子系统选择框,选 Direct3D9 Rendering SubSystem 点 OK 进场景。这一步过了,说明 SDK 编译、运行库、插件加载三件事全部正常,可以进入工程配置阶段。
起不来的时候,第一现场不是弹窗,是 exe 同目录下的Ogre.log。这个文件会把插件加载顺序、D3D9 设备创建、资源组初始化逐条记下来,最后一行通常就是卡住的位置:
| 日志最后停在哪 | 大概率原因 | 处理方向 |
|---|---|---|
Creating D3D9 RenderSystem | d3dx9_43.dll缺失或显卡不支持 D3D9 | 回 2.2 补 dll,用诊断工具确认设备能力 |
Loading plugin后无下文 | plugins.cfg里的 dll 名与实际文件对不上 | 核对bin\debug下插件 dll 的实际文件名 |
Parsing scripts报错 | 资源路径没配,resources.cfg指向不存在的目录 | 检查resources.cfg里的相对路径 |
| 完全没有日志生成 | exe 根本没跑起来,缺依赖 dll | 用依赖查看工具确认缺哪个 |
4. VS2010 工程配置:OgreTemplate 属性页逐项落地
SDK 编过只是证明了引擎本身没问题,真正写代码还得有个自己的工程。这一章按属性页从上到下的顺序走一遍,重点解释每条配置为什么这么写——照抄谁都会,遇到报错知道该改哪一行才有用。所有设置都涉及"所有配置"和具体配置两个层级,层级搞混是后面第 5 章第一个坑的源头。
4.1 新建 Win32 空项目与四个框架文件
新建项目选 Win32 控制台应用程序,名称OgreTemplate,向导里应用程序类型选控制台,附加选项勾"空项目"——不勾会自带一个stdafx.h和_tmain,和 Ogre 的入口点冲突。
工程建好后,右键项目 → 添加 → 现有项,把 TutorialFramework 里的四个文件加进来。这四个文件是官方给的最小示例骨架,分工大致是:
| 文件 | 作用 | 引入后要动的部分 |
|---|---|---|
BaseApplication.h | 声明应用基类,管窗口、场景管理器、帧监听 | 无需改动 |
BaseApplication.cpp | 实现初始化、帧渲染、消息循环 | 通常无需改动 |
TutorialApplication.h | 声明具体示例类,继承基类 | 无需改动 |
TutorialApplication.cpp | 示例场景搭建,入口函数在这里 | 可在此加自己的场景内容 |
文件加进来之后先别编译,此时包含目录还没配,必然是满屏红波浪线。顺序是先把属性页配完,再回来生成。
4.2 所有配置层级的字符集、调试命令与工作目录
属性页打开后,第一件事是把左上角的"配置"下拉切成"所有配置"。这一步决定后面几项是公共设置还是只对 Debug 生效。字符集必须改成"使用多字节字符集",原因是 Ogre 1.7.3 的接口大量使用char*和std::string,默认的 Unicode 字符集下LPCWSTR和const char*会在每个字符串参数上打架。
调试页和工作目录的设置,是为了让 F5 启动时 exe 能找到 cfg 和资源:
| 属性页位置 | 项 | 值 |
|---|---|---|
| 配置属性 → 常规 | 字符集 | 使用多字节字符集 |
| 配置属性 → 调试 | 命令 | $(OGRE_HOME)\Bin\$(Configuration)\$(ProjectName).exe |
| 配置属性 → 调试 | 工作目录 | $(OGRE_HOME)\bin\$(Configuration) |
"命令"这一项容易被误解成"填源码路径"。它填的其实是调试器要启动的那个可执行文件,配合 4.4 的后期生成事件,编译完 exe 会被自动拷到Bin\$(Configuration),F5 直接跑的就是拷贝后的那份。工作目录设成bin\$(Configuration),是为了让程序启动时按相对路径找到plugins.cfg、resources.cfg和media目录。
注意:路径里的
Bin和bin在 Windows 下不区分大小写,但在写 cfg 和日志排查时建议统一用实际目录名,避免自己看日志时对不上。
4.3 附加包含目录与附加库目录的宏写法
这两项是编译期和链接期的分水岭。包含目录决定#include <Ogre.h>能不能找到头文件,库目录决定链接器能不能定位到.lib。都写在"所有配置"下,用$(OGRE_HOME)派生。
包含目录,五条用分号隔开,末尾不要带分号:
$(OGRE_HOME)\include $(OGRE_HOME)\include\OIS $(OGRE_HOME)\include\OGRE $(OGRE_HOME)\Samples\Common\include $(OGRE_HOME)\boost_1_44第一条覆盖 Ogre 主头文件,第二条是输入系统 OIS(键盘鼠标),第三条是 Ogre 内部按模块分的子目录,第四条给BaseApplication用,第五条给 Boost。少任何一条,对应的报错都是"无法打开源文件 xxx.h",报错文件名能直接告诉你是哪条漏了。
库目录两条:
$(OGRE_HOME)\lib\$(Configuration) $(OGRE_HOME)\boost_1_44\lib关键在$(Configuration)。它在 Debug 配置下展开成Debug,Release 下展开成Release,一份设置两套目录自动切换。如果图省事写成$(OGRE_HOME)\lib\Debug,Release 就会去链接 Debug 版的库,运行期 CRT 冲突,症状是程序能编过但一启动就崩。
4.4 后期生成事件:copy 命令的三个参数
生成事件这一项,作用是把编译出来的 exe 拷到bin\$(Configuration),让调试器和工作目录对得上。
:: $(OutDir) 是编译输出目录,$(TargetFileName) 是 exe 全名,$(Configuration) 是当前配置名 copy "$(OutDir)$(TargetFileName)" "$(OGRE_HOME)\Bin\$(Configuration)"三个宏都是 VS 内置的。$(OutDir)末尾自带反斜杠,所以中间不再补\;$(TargetFileName)含扩展名,比$(TargetName)更省事;$(Configuration)保证 Debug 的 exe 进Bin\Debug、Release 的进Bin\Release,不串味。
这条命令失败最典型的表现是生成成功但 F5 启动报"系统找不到指定的文件"。原因是Bin\$(Configuration)这个目录在 SDK 解包时可能不存在(有些版本只有bin\debug小写目录)。先手动确认目录存在,或者把命令改成拷贝到实际存在的目录。
4.5 Debug 与 Release 的附加依赖项差异
最后一步,把配置下拉切成Debug,进 链接器 → 输入 → 附加依赖项,填两个 Debug 版库;再切Release,填同名的非_d版本。
Debug : OgreMain_d.lib ; OIS_d.lib Release : OgreMain.lib ; OIS.lib命名规则很直白:带_d后缀的是 Debug 版,不带的是 Release 版。这个后缀不是可选的装饰,两套库的 CRT 版本不同,链接阶段混用会报重复定义的符号,运行阶段混用会在堆操作上直接崩。
填的时候用半角分号分隔,别用中文全角分号,也别在分号前后留空格。原料里那句 "OgreMain_d.lib ;OIS_d.lib" 中间就是个全角分号,照抄进去链接器会把它当成库文件名的一部分,报"无法打开输入文件"。这条坑我吃过不止一次。
到这里点确定,生成解决方案。没有错误的话,F5 应该弹出渲染子系统选择框,选 Direct3D9 进场景,模板工程就跑通了。
5. 避坑与排查:五个让配置当场翻车的细节
前面四章按顺序走下来,正常情况都能跑通。但真实环境里总有一两个地方不按剧本走,这一章按"现象 → 原因 → 解决"整理五条复发率最高的,都是反复验证过的。
5.1 现象:LNK1104 无法打开 OgreMain_d.lib,但目录里明明有
现象:编译通过,链接阶段报LNK1104: 无法打开文件"OgreMain_d.lib",去%OGRE_HOME%\lib\debug下面看,文件确实躺在那里。
原因:库目录没展开到实际位置。最常见的是附加库目录只写了$(OGRE_HOME)\lib,少了\$(Configuration),链接器去lib根目录找,自然找不到。第二种是环境变量值末尾多了个反斜杠,拼出来变成D:\...\lib\\Debug,大部分情况能容忍,但个别中文路径加上双斜杠会出问题。第三种是前面提到的全角分号。
解决:在属性页里把光标放到那条设置上,点右侧的下拉箭头展开宏,直接看拼出来的绝对路径对不对。这一招比猜快十倍。同时把附加依赖项里的半角分号、前后空格清理干净。
5.2 现象:双击 exe 一闪而过,Ogre.log 停在创建渲染系统
现象:直接双击bin\debug下的 exe,黑窗口一闪就没了;看Ogre.log,最后一行停在Creating D3D9 RenderSystem。
原因:按概率排,第一是d3dx9_43.dll缺失,32 位进程在 64 位系统上找不到SysWOW64里的那份;第二是显卡驱动太新,不再支持 D3D9 的某些能力位;第三是plugins.cfg里写的插件 dll 名和磁盘上的实际文件名对不上。
解决:先补 dll(两个目录都放,见 2.2);还不行的,把plugins.cfg里的渲染插件行改成实际文件名,或者临时只保留 Direct3D9 一项排除干扰。设备能力问题只能换机器或换渲染后端验证,不是配置能救的。
5.3 现象:Debug 编得过,Release 一生成就报一堆链接错误
现象:Debug 配置正常生成,切到 Release 之后报大量LNK2005 已经在 xxx.obj 中定义,或者LNK2038运行库不匹配。
原因:一是 Release 下的附加依赖项还留着_d后缀的库,Debug 版库自带调试版 CRT,和 Release 的/MD冲突;二是 C/C++ → 代码生成 → 运行库里,Debug 和 Release 用了同一套设置。
解决:Release 的附加依赖项必须换成不带_d的两个库;运行库 Debug 用/MDd、Release 用/MD,两边都别改成/MT——Ogre 的预编译库是按动态 CRT 编的,静态链接必然冲突。
5.4 现象:SamplesBrowser 能开,但个别示例点进去报加载失败
现象:主界面正常,唯独某几个示例报could not load plugin或 dll 相关错误。
原因:这些示例依赖的插件 dll 编译输出没归位,也就是第 3.3 节说的cthugha那类目录。工程文件里的输出路径是相对路径,跟随解决方案目录算下来落到了盘符根下,没被搬进bin\debug。
解决:按 3.3 的 xcopy 命令把产物整体覆盖过去,重启SamplesBrowser。如果还是不行,去Ogre.log里看它到底在找哪个文件名,再回磁盘上搜这个文件在不在。
5.5 现象:属性页改了,重新生成还是报找不到头文件
现象:明明在属性页里加了包含目录,点确定、重新生成,错误一模一样,像是设置没保存。
原因:配置层级搞混了。属性页左上角如果停在Debug,你改的只是 Debug 这一份;回头切到 Release 或者切到"所有配置",看到的还是旧值。反过来,先在"所有配置"里改,再切到 Debug 单独改过某项,Debug 那一份就会覆盖公共设置,看起来像"改了不生效"。
解决:养成固定顺序——公共项(字符集、包含目录、库目录、后期生成事件)一律在"所有配置"下改;有差异的项(附加依赖项、运行库)只在 Debug 和 Release 各自下面改。改完随手切到另一个配置确认一遍值是对的,比事后排查省时间。
6. 进阶:把 OgreTemplate 沉淀成属性表复用
模板工程跑通之后,下一个项目又得从头点一遍属性页,这套重复劳动很容易在第三次的时候点错某一项。我的做法是把公共配置抽成属性表(.props),新工程直接继承,属性页里只留真正因项目而异的两三项。
属性表的思路很简单:把OGRE_HOME的展开、五条包含目录、两条库目录写进一个OgreCommon.props,在工程里通过"属性管理器"挂上去。核心内容大致是这样:
<?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <!-- 只在这里维护一次 SDK 路径,换盘改这一行 --> <OgreHome>D:\Ogre\OgreSDK_vc10_v1-7-3</OgreHome> </PropertyGroup> <ItemDefinitionGroup> <ClCompile> <!-- %(AdditionalIncludeDirectories) 必须留在末尾,否则会覆盖工程自身的设置 --> <AdditionalIncludeDirectories>$(OgreHome)\include;$(OgreHome)\include\OIS;$(OgreHome)\include\OGRE;$(OgreHome)\Samples\Common\include;$(OgreHome)\boost_1_44;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> </ClCompile> <Link> <AdditionalLibraryDirectories>$(OgreHome)\lib\$(Configuration);$(OgreHome)\boost_1_44\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> </Link> </ItemDefinitionGroup> </Project>末尾那两句%(...)是关键。属性表的设置是叠加而非替换,如果不把原值带上,工程里单独加的路径会被整条清掉——这个坑很隐蔽,表现为"挂上属性表之后原来能编的工程突然报找不到某个头文件"。附加依赖项因为有 Debug/Release 差异,建议留在工程里不放属性表。
配好之后,新工程的标准动作压缩成四步:建空项目、挂属性表、加四个框架文件、填附加依赖项。我一般还会附一张验收清单,每次新建都过一遍:
| 检查项 | 通过标准 |
|---|---|
| 环境变量 | echo %OGRE_HOME%输出正确路径且无尾斜杠 |
| 运行库 | System32与SysWOW64下都有d3dx9_43.dll |
| SDK 产物 | bin\debug\SamplesBrowser.exe能进 D3D9 场景 |
| 字符集 | 属性页显示"使用多字节字符集" |
| 后期生成 | 生成日志里 copy 命令返回"已复制 1 个文件" |
| 首次运行 | F5 弹出渲染子系统选择框,Ogre.log无 error 行 |
从那以后我每次新建 Ogre 工程,都会先把这张表过一遍再写第一行代码,尤其是字符集和 copy 事件两项——它们出问题时的报错信息完全不指向真实原因,事后排查花的时间是事前检查的十倍。希望帮到你。
本文还有配套的精品资源,点击获取