为了写这篇博客,我把自己以前已经编译好的CE全删除了,从头开始来一遍,以便帮助大家,从头开始编译一个完整的CryEngine。
目录
从github获取CryEngine最新源码
下载第三方依赖库
Cmake构建VS工程
常见编译报错解决
SandBox启动报错
在使用过程中给引擎添加缺失模块
注:【常见编译报错解决】【SandBox启动报错】这两个小节会不间断更新,你现在看到的不一定是最全的!后续使用过程还有什么报错的话也会陆陆续续上传解决办法。
需要快速解决问题请加QQ群:457378561,群里聊
编译时间:2018年9月30日
克隆或者解压缩完成后进入目录点击download_sdks.exe或者手动下载第三方依赖库,如果使用程序下载经常失败还是选择手动下载。这里我选择手动下载
手动下载链接
把下面地址复制到迅雷或者浏览器即可下载:
https://github.com/CRYTEK/CRYENGINE/releases/download/5.5.0_preview4/CRYENGINE_v5.5.0_SDKs
如果是直接点击download_sdks.py或者download_sdks.exe下载第三方库他会自行解压到code/SDKs这个目录下
手动下载的第三方依赖压缩包请自行解压到Code/SDKs这个目录下,SDKs目录需要自行手动添加,解压后的截图如下:
CryEngine使用Cmake管理源码工程,不知道Cmake是什么请自行百度学习。
为什么源码路径会是G:\CryEngine\CRYENGINE,因为这个目录下有最顶级的CMakeLists.txt文件,想知根知底的自己去学习cmake。
然后点【configure】开始配置工程,cryengine只有visual studio 2015以上VS版本能编译通过,所以这里如下图选择VS版本,有2015的也可以选择2015
配置好点【Finish】之后,就开始了。然后cmake会报错,我们来看一下
报错信息说 在SandBox模块下缺少FBXSdk(2016),我们就来下个吧
FBX下载网址:
https://www.autodesk.com/developer-network/platform-technologies/fbx-sdk-archives
或者下面这个百度网盘地址:
链接:https://pan.baidu.com/s/1GUmOJuvtWPTzbN0x5FCxOw
提取码:jemg
由于报错说是2016的,我们就来下个FBX2016最新的
下载后不知道安装在哪?没事,一起来再看下详细的报错信息
Tools/CMake/Build.cmake:43 (include)
这行是 include ("${TOOLS_CMAKE_DIR}/BuildSandbox.cmake")
就说明在BuildSandbox.cmake出错的,到该文件下找到如下一行:
if(NOT EXISTS "${SDK_DIR}/FbxSdk")
message(WARNING "FBX SDK (2016) is required to build Sandbox. Download it from https://www.autodesk.com.")
return()
endif()
不存在就打印报错信息,${SDK_DIR}显然就是Code/SDKs这个目录,然后需要把FBXSDK安装到FbxSdk这个目录下。看下面的Cmake路径一定要对应:
FBXsdk目录下直接就是include lib等等这些文件夹
然后再点【Configure】,如果还发现报错信息请按照上述方法去修改。
p4api这个sdk应该还会报错,可以去github或者google上搜索下载对应的sdk版本,如果自己找不到也可以用我网盘里面的
链接:https://pan.baidu.com/s/1GUmOJuvtWPTzbN0x5FCxOw
提取码:jemg
CMAKE上有些勾选项,需要的自行勾选,一般默认就行,勾选后点【Configure】还报错的话,一样的解决办法。
最后【Configure】没有报错的话我们就点【Generate】,然后到构建目录下就能找到.sln然后打选择ALL_BUILD就开始编译了。
编译选项有 debug,profile,release。debug和release不用多说,profile这个选项就是完全通过编译器优化后再编译的,调试的时候开这个会乱跳,建议编译的时候完全选择profile,需要调试相关模块的时候,再在相关模块上右键选择debug编译后再调试。
编译如果出现报错,什么模块报什么样的错属于C++编译的范畴了自行解决。
实在不会解决给我留言或者加QQ群:457378561 咨询
右击项目–>属性–>c/c++ --> 常规–>附加包含目录,添加以下两个文件夹路径
同样在链接器里面添加dx和VS编译对应的lib路径,我的如下
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.16299.0\um\x64
你想问如何找到这种路径的? 直接用Everything这个东西搜到了,搜到一大堆选择自己需要的就行了
这个错误是qmake再真正的c++编译之前对QT的源文件预编译时报的错,发生这种错误的问题一般资源缺失造成的,那么我们就从该模块的cmake开始入手吧。
具体来看看这个模块的CMakeLists.txt这个里面都写了什么:
从上图可以看出该模块依赖第三方库p4api,p4api是什么自己去网上多了解下这里给个网盘地址:
链接:https://pan.baidu.com/s/1GUmOJuvtWPTzbN0x5FCxOw
提取码:jemg
关于p4api的下载给出了下载链接,网上也能直接搜索到。
对应CMakeLists.txt如下:
#START-FILE-LIST
# File List auto generated by waf2cmake.py, do not modify manually.
start_sources()
# -- perforceplugin.waf_files --
sources_platform(ALL)
add_sources("NoUberFile"
SOURCE_GROUP "Root"
"PasswordDlg.cpp"
"PasswordDlg.h"
"PerforcePlugin.cpp"
"PerforcePlugin.h"
"PerforcePlugin.rc"
"PerforcePlugin.qrc"
"PerforceSourceControl.cpp"
"PerforceSourceControl.h"
"resource.h"
"stdafx.cpp"
"stdafx.h"
)
end_sources()
#END-FILE-LIST
CryEditorPlugin(PerforcePlugin PCH "stdafx.cpp" SOLUTION_FOLDER "Sandbox/Plugins" DISABLE_MFC)
force_static_crt()
target_compile_definitions(${THIS_PROJECT} PRIVATE -DBOOST_ALL_NO_LIB)
target_include_directories(${THIS_PROJECT} PRIVATE "${SDK_DIR}/p4api/include")
if (MSVC_VERSION GREATER 1900) # Visual Studio > 2015
set(p4api_subfolder vc14)
elseif (MSVC_VERSION EQUAL 1900) # Visual Studio 2015
set(p4api_subfolder vc14)
elseif (MSVC_VERSION EQUAL 1800) # Visual Studio 2013
set(p4api_subfolder vc12)
elseif (MSVC_VERSION EQUAL 1700) # Visual Studio 2012
set(p4api_subfolder vc11)
endif()
set_libpath_flag()
set_property(TARGET ${THIS_PROJECT} APPEND_STRING PROPERTY LINK_FLAGS_DEBUG " ${LIBPATH_FLAG}\"${SDK_DIR}/p4api/${p4api_subfolder}_x64_debug/lib\"")
set_property(TARGET ${THIS_PROJECT} APPEND_STRING PROPERTY LINK_FLAGS_PROFILE " ${LIBPATH_FLAG}\"${SDK_DIR}/p4api/${p4api_subfolder}_x64_release/lib\"")
set_property(TARGET ${THIS_PROJECT} APPEND_STRING PROPERTY LINK_FLAGS_RELEASE " ${LIBPATH_FLAG}\"${SDK_DIR}/p4api/${p4api_subfolder}_x64_release/lib\"")
target_link_libraries(${THIS_PROJECT} PRIVATE libclient libp4sslstub librpc libsupp)
上面是头文件的路径应该在Code/SDKx/p4api/include下,根据不同的VS版本选择不同目录下lib去链接,路径都清楚了后,把刚才下载的p4api按照一模一样的路径去放置,include直接解压,对应的lib放到不同的目录下(lib的目录是自己根据CMake内容新建的),我的目录如下:
这里的路径要弄仔细了,仔细看我上面的路径,然后再编译,还是报同样的错,然后在编译输出中找到了这一句:
这个就很明显了,是qt的rcc资源编译的时候没有找到p4.ico这个图标,这个解决办法就是从网上随便下载个ico重命名为p4.ico并放到对应的目录下就能编译过了。res/p4.ico是个相对路径,但是该放在哪里呢?
我们仔细看报错信息:
Error in 'G:/CryEngine/CRYENGINE/Code/Sandbox/Plugins/PerforcePlugin/PerforcePlugin.qrc': Cannot find file 'res/p4.ico'
G:/CryEngine/CRYENGINE/Code/Sandbox/Plugins/PerforcePlugin
这个路径不带build,说明是下载源码里面的,很奇怪官方为啥一直不加上去,所以我们在这个目录下新建一个目录叫res,然后把自己下载改名后的图标一个是p4.ico和p4_error.ico放进该目录下。问我咋知道的?看下图就明白了
比如我的图标如下:
然后再编译应该能通过了。
编译成功后,最好提前下载一个官网的引擎launcher版,因为在启动SandBox的时候模块加载到CryAction的时候会验证用户信息,让你登陆Launcher。在预览版的时候这一步只要等一段时间会自动跳过,但我编译的这个版本没试过。然后把SandBox模块设置为启动项,F5运行就能启动了
这个rc.exe我个人猜测应该是RC这个模块编译出来的,但是这个模块里面什么cpp都没有。然后我从官方下载的引擎包里找到这个东西,就把他复制到了对应的路径下,下次启动就不再报这个错了。这个rc包我已经压缩上传百度网盘,可自行下载。对应路径为:CRYENGINE\Tools\rc。
没有找到.cryproject错误
这个错误,在之前的预览版是可以直接跳过的,跳过之后再选择不预先加载.cryproject就行了,等到编辑器界面出来后,再从菜单打开工程即可。如果想自己手动加的话在VS项目中找到SandBox模块然后
右键–>属性–>调试–>命令参数 中添加如下内容:
-project "your .cryproject path"
无法加载CryGamePlatfrom模块
这个模块在cmake的时候没有勾选的话就不会加入整个工程项目参与编译,这个模块应该是跟steam平台对接的一个dll,便于游戏的发布吧。这里暂时用不到就不说了,直接点【ok】跳过就行,如果需要安装的看在使用过程给引擎添加模块这个章节有说。
打开游戏场景时跳出崩溃对话框
万事功成的时候,在编辑器完美启动后,然后打开一个场景,这个时候发现突然崩溃了,崩溃如下图:
这个崩溃猜想应该是什么东西的矩阵这个变量无效导致的。千万别在这个时候放弃啊(这个问题只是在完全Debug版中会崩溃,Profile版不会出现这个问题)。解决办法就是点【Ignore All】就过去了或者完全改成Profile版再编一个。
运行成功截图
什么!?!?才有9.2帧,因为我的整个工程都是debug版的,所以不用大惊小怪的,全部换成profile版的就不会是9.2了。
引擎都编译好了,发现有一些模块没有由于之前cmake的时候没有勾选,导致某些功能不能用,怎么办??
别担心,再次打开我们之前用的cmake,然后勾选对应的模块,比如缺失CryGamePlatform导致运行CryGameSDK模块时包如下错误:
这个时候我们就应该想到这个CryGamePlatform应该来自于官方,因为模块名很官方化。所以就应该想到当时我们急匆匆cmake的时候应该遗漏了一些项,然后再次打开cmake找到如下选项,然后打勾:
然后再点【Configure】,配置的时候会报错
not find "SDKs/Steamworks"
下载链接地址:
https://partner.steamgames.com/downloads/steamworks_sdk_142.zip
之前猜测的果然没错,勾选的这个插件模块跟steam平台有密切的关系,然后我们去steam官网把这个sdk下下来放到对应的目录下再【Configure】就没问题了。配置成功后即可点击【Generate】生成工程,我的Steamworks的目录如下: