Skip to content

Latest commit

 

History

History
283 lines (176 loc) · 15.8 KB

ygo_compile.md

File metadata and controls

283 lines (176 loc) · 15.8 KB

Windows10下编译YGOPRO(2021.03.21)

今天来录一下windows10下编译ygopro的过程和踩过的坑。我会尽量把编译过程中我遇到的问题都复现一遍,以便大家在遇到问题时有解决方案可以参考。整理之后,我会把这个文档传到github上。

0. 默认读者已经掌握的技能

  • 能够打开Windows Powershell并执行简单操作
    • 使用cd命令切换目录
    • 知道..代表上级目录、Tab可以自动补全等
    • 推荐下载并安装VS Code
  • 能够下载并安装WinRAR
  • 能够下载并安装git
    • 虽然不安装,直接下载源码也可以,但还是建议安装一下
  • 能够下载并安装Visual Studio 2019
  • 能够下载Premake4,并添加到环境变量
    • 官方教程中给的链接下载的是premake源码,可以直接下载编译好的premake4命令
  • 能够打开官方教程

1. 下载ygopro源码

切换到一个舒适的工作目录并下载源码,我的目录是:

D:\ygospace\

ygo_compile.md(此Markdown文档,本次编译记录)
ygopro(使用git克隆源码之后将出现该文件夹,本次演示中使用)

在Windows Powershell中切换到D:\ygospace\目录并输入

git clone https://github.com/Fluorohydride/ygopro.git cd ygopro git submodule update --init --recursive

可能问题1:OpenSSL报错或者GNU报错。一般都是因为本地端口被封了,不支持https协议克隆代码,常见于公司内网。

fatal: unable to access 'https://github.com/Fluorohydride/ygopro.git/': OpenSSL SSL_read: Connection was reset, errno 10054

解决方法:使用ssh协议

git clone [email protected]:Fluorohydride/ygopro.git

可能问题2:下载子模块过程中疑似卡住,命令行迟迟没有输出

解决方法:等!在网络不是很好的情况下,下载script模块可能要花很长时间,因为脚本很多。

2. 下载依赖

D:\ygospace\ygopro\里创建一个新文件夹packages用来保存安装包。

官方教程中提供的依赖:

下载并解压这些压缩包。

可能问题:链接无法下载lua

解决方法http改成https

3. 编译event

打开x86 Native Tools Command Prompt for VS 2019,之后也请一直使用该命令行。虽然Developer Command Prompt for VS 2019默认也是32位编译,但是保险起见,我们还是使用x86命令行。

切换到工作路径并输入

d:
cd ygospace\ygopro\packages\libevent-2.0.22-stable
nmake Makefile.nmake

D:\ygospace\ygopro\里创建一个新文件夹event。将编译出的include文件夹移动到D:\ygospace\ygopro\event,将WIN32-Code里的所有文件都移动到D:\ygospace\ygopro\event\include中,将libevent.lib移动到D:\ygospace\ygopro\event\lib并更名为event.lib。官方教程中说编译出来的是event.lib,但实际上是libevent.lib

可能问题:nmake报错

解决方法:检查是不是误用了64位编译的命令行

4. 编译freetype

官方教程中提供的freetype链接下载的直接就是编译好的库,可以直接拷贝出来。

D:\ygospace\ygopro\里创建一个新文件夹freetype。将编译出的includelib都移动到D:\ygospace\ygopro\freetype即可。

5. 编译irrlicht

5.1

打开D:\ygospace\ygopro\packages\irrlicht-1.8.1\source\Irrlicht\Irrlicht10.0.sln,弹出窗口是否重定向项目至已有平台工具集,点“确定”。如果没有弹出该窗口,或者一不小心点击“取消”。可以右键解决方案里面irrlicht(Visual Studio 2010),在配置属性->常规中更改平台工具集为Visual Studio 2019(v142)。

跳过该步骤会出现问题:无法找到平台工具集

MSB8020 无法找到 Visual Studio 2010 的生成工具(平台工具集 =“v100”)。若要使用 v100 生成工具进行生成,请安装 Visual Studio 2010 生成工具。或者,可以升级到当前 Visual Studio 工具,方式是通过选择“项目”菜单或右键单击该解决方案,然后选择“重定解决方案目标”。 Irrlicht C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppBuild.targets

5.2

irrlich\include\IrrCompileConfig.h中注释掉#define _IRR_COMPILE_WITH_DIRECT3D_9_#define _IRR_COMPILE_WITH_DIRECTINPUT_JOYSTICK_。实际上是可以不注释掉的,但是需要安装别的东西会很麻烦。

跳过该步骤会出现问题:“d3dx9shader.h”

C1083 无法打开包括文件: “d3dx9shader.h”: No such file or directory Irrlicht D:\ygospace\ygopro\packages\irrlicht-1.8.1\source\Irrlicht\CD3D9ShaderMaterialRenderer.h

5.3

配置属性->C/C++->代码生成->运行库修改为多线程调试DLL(/MDd)。这是因为之后ygopro项目是按照多线程调试DLL(/MDd)编译的,子模块编译要和父模块一致。

跳过该步骤会出现问题:后面编译ygopro时,MTd和MDd不匹配

LNK2038 检测到“RuntimeLibrary”的不匹配项: 值“MTd_StaticDebug”不匹配值“MDd_DynamicDebug”(CGUIImageButton.obj 中) ygopro D:\ygospace\ygopro\build\Irrlicht.lib(CGUIButton.obj)

5.4

配置属性->C/C++->预处理器->预处理器定义中删掉_ITERATOR_DEBUG_LEVEL=0Debug模式默认是_ITERATOR_DEBUG_LEVEL=2,但是irrlicht项目非要规定为0,而ygopro项目是按照Debug默认_ITERATOR_DEBUG_LEVEL=2编译的,子模块编译要和父模块一致。

后续步骤中也要确保每次在VS 2019中编译时都保持“_ITERATOR_DEBUG_LEVEL”相同,一般Debug模式默认是2,Release模式默认是0,需要注意有没有特殊设置在配置属性->C/C++->预处理器->预处理器定义里。

B战上另外一位up主在介绍如何编译ygopro时【秋名之巅】《YGOPro》 编译过程详解,说有很多步骤都不应该设置Debug而是Release。但实际上只需要前后保持一致就可以了,可能正是因为irrlicht的默认设置中,明明是Debug模式,却按照Release模式设置了_ITERATOR_DEBUG_LEVEL=0

跳过该步骤会出现问题:后面编译ygopro时,检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项

LNK2038 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2”(CGUIImageButton.obj 中) ygopro D:\ygospace\ygopro\build\Irrlicht.lib(CGUIButton.obj)

确认一下配置属性->常规中的配置类型输出目录,配置类型如果是.dll要手动修改为.lib,并将输出目录中的bin修改为lib。请注意按照Debug+Win32编译,生成错误窗口提示无法启动程序是正常的,因为我们编译出来的是irrlicht.lib静态库文件,本来也无法单独运行。

D:\ygospace\ygopro\里创建一个新文件夹irrlicht。将编译出的include移动到D:\ygospace\ygopro\irrlicht,并将lib\Win32-visualstudio\Irrlicht.lib[^irrlichtwin64]移动到D:\ygospace\ygopro\irrlicht.lib。目标lib文件大概在40M左右,如果太小可能就是编译失败了,检查设置,配置类型是否是静态库.lib等。官方教程中给的是Win64-visualstudio,似乎是笔误。

6. 编译lua

官方教程中提供的lua链接版本是5.2,但是5.2已经不适用了。

使用lua5.2版本会出现的问题:lua_KContext等

C2065 “lua_KContext”: 未声明的标识符 ocgcore D:\ygospace\ygopro\ocgcore\libgroup.cpp

D:\ygospace\ygopro\packages\里创建一个新文件夹luaCompile用来存放工程。新建一个“空项目”,使用C++ for Windows从头开始操作,不提供基础文件。将D:\ygospace\ygopro\packages\lua-5.3.6\src文件夹中全部.h.hpp后缀的文件都添加到项目的头文件中,将.c后缀的文件都添加到项目的源文件中。(技巧是按照类型排序)

配置属性->常规中更改配置类型静态库(.lib)

跳过该步骤可能会出现问题:只编译出.exe而没有.lib文件

请注意按照Debug+x86编译,生成错误窗口提示无法启动程序是正常的,因为我们编译出来的是lua.lib静态库文件,本来也无法单独运行。

D:\ygospace\ygopro\里创建一个新文件夹lua。将D:\ygospace\ygopro\packages\lua-5.3.6\src文件夹中lua.hlualib.hlua.hppluaconf.hlauxlib.h复制到D:\ygospace\ygopro\lua\include中,将编译出来的Debug\lua.lib复制到D:\ygospace\ygopro\lua\lib中。

按照官方教程,如果使用VS 2019编译需要添加一些额外的设置,例如配置属性->链接器->命令行中添加/FORCE配置属性->C/C++->高级->禁用特定警告设置为4996。但是lua5.3已经不会报C4996的错误了,所以不需要加,而生成静态库.lib不需要链接器选项,/FORCE也就没用了,甚至根本不会有这一设置。

7. 编译sqlite3

D:\ygospace\ygopro\packages\sqlite-dll-win32-x86-3081002文件夹中的全部内容拷贝到D:\ygospace\ygopro\packages\sqlite-amalgamation-3081002中。打开x86 Native Tools Command Prompt for VS 2019,在D:\ygospace\ygopro\packages\sqlite-amalgamation-3081002目录下输入

lib /def:sqlite3.def /out:sqlite3.lib

D:\ygospace\ygopro\里创建一个新文件夹sqlite3。将D:\ygospace\ygopro\packages\sqlite-amalgamation-3081002文件夹中sqlite3.hsqlite3ext.h复制到D:\ygospace\ygopro\sqlite3\include中,将编译出来的sqlite3.lib复制到D:\ygospace\ygopro\sqlite3\lib中。

其实这里如果不创建includelib文件夹,直接放在sqlite3文件夹下更方便。但是考虑到目录整齐,我们还是保持和其他库一致。

8. 使用premake4

按照官方教程需要先删掉premake4.lua下的这些行:

if os.is("windows") then
include "event"
include "freetype"
include "irrlicht"
include "lua"
include "sqlite3"
end

这是因为这些文件夹下没有premake4.lua文件,如果纳入到项目中的话,premake4命令会不知所措。

cannot open D:/ygospace/ygopro/lua/premake4.lua: No such file or directory

9. 编译ygo项目

由于我们使用的是premake4命令,支持的最高vs版本就是2010,所以使用vs2019打开时仍然会弹出平台工具集重定向,点“确定”就好。如果没能做到,解决方法见前文5.1。

按照官方教程需要将如下文件移动到premake4生成的build文件夹下:

  • script/
  • single/
  • textures/
  • cards.cdb
  • lflist.conf
  • strings.conf
  • system.conf

实际上直接克隆的源码只需要移动如下文件:

  • script/
  • sound/
  • textures/
  • lflist.conf
  • strings.conf
  • system.conf

按照官方教程需要在system.conf中修改use_d3d为0,但实际上已经修改好了,不需要动,可以检查一下。

按照官方教程需要在gframe文件夹下创建一个空白的ygopro.rc文件,实际上是编译出来文件的缩略图。

接下来需要添加大量的库,主要是前面创建的5组includelib。但在实际编译过程中,有一些奇怪的路径也需要编译进来。同时,这一步还会遇到奇奇怪怪的问题,所以我们从什么都没改开始,每报一个错,就改动一点解决它。

报错1:cspmemvfs报错无法打开包括文件: “sqlite3.h”: No such file or directory

改动1:右键cspmemvfs在配置属性->C/C++->常规->附加包含目录中添加..\sqlite3\include

默认这些项目,包括ocgcore和ygopro似乎都会添加..\sqlite3,所以前面说不创建includelib可能会更方便一些。

报错2:ocgcore找不到lua头文件

改动2:右键ocgcore在配置属性->C/C++->常规->附加包含目录中添加..\lua\include

报错3:ygopro找不到freetype/config/fthreader.h

改动3:右键ocgcore在配置属性->C/C++->常规->附加包含目录中添加..\freetype\include\freetype2

报错4:“初始化”: 无法从“const T *”转换为“const wchar_t *”

点击报错跳转到问题代码,观察到等式右边返回的是irr::c8指针,不能强转为wchar_t*。注意到如果没有定义宏_WIN32,可以使用buffer转过来,那显然我们也按照不是_WIN32的情况来就行了。

改动4:注释掉错误的IF分支

目前我还没有尝试使用自己编译的程序联机和人对战,因此注释掉IF分支的方法只能说暂时允许编译通过。宏_WIN32表示的是Windows系统,该处代码的强转到底是否会受到Windows上buffer编码的影响有待验证。不过我感觉问题不大,因为只是指针地址的转换。

报错5:无法解析的外部符号,lua相关

改动5ocgcore\interpreter.h中添加#include "lua.hpp"

ygopro是C++语言写的,但是lua是c语言编译的,为了让C++能够调用C函数的库,需要使用extern "C"这种写法,但是ocgcore\interpreter.h里没这么搞。当然也可以将lua.hpp里的头粘贴到interpreter.h里面,效果是等价的。

extern "C" {  
    #include "lua.h"  
    #include "lualib.h"  
    #include "lauxlib.h"  
}

可能问题1:编译过程中会遇到大量C4828警告

解决方法:放置play,不要管她

可能问题2:无法解析的外部符号,irrlicht相关

解决方法:检查包含库目录下的irrlicht.lib,会不会粘贴过来了一个只有60k左右的空壳子文件。

可能问题3:在解决前面的一些bug之后重新生成项目,出现一些看不出所以的报错

解决方法:清理项目,删掉binobj并重新生成项目可以解决大多数问题

10. 运行ygopro项目

编译好的ygopro程序在bin\debug文件夹下。

报错1:找不到freetype6.dll

改动1:搞一个

可以在这里D:\ygospace\ygopro\packages\freetype-2.3.5-1-bin\bin找到,复制到ygopro.exe相同目录,或者系统目录(请谨慎操作,除非你清楚你在做什么)中。

报错2:找不到zlib1.dll

改动2:搞一个

可以在这里D:\ygospace\ygopro\packages\irrlicht-1.8.1\source\Irrlicht\zlib找到zlib的源文件。但是自己编译太麻烦,建议下载一个。注意下载32位的。

https://cn.dll-files.com/zlib1.dll.html

报错3:程序无法正常启动,0xc00007b

改动3:搞一个sqlite3.dll

可以在这里D:\ygospace\ygopro\packages\sqlite-amalgamation-3081002找到。

报错4:出现error.log文件

Failed to create Irrlicht Engine device!

改动4ygopro.exe和前面的.dll文件移动到build文件夹下

需要ygopro.exe和资源放在一起才能正确创建irrlich引擎。

报错5:出现error.log文件

Failed to load card database (cards.cdb)!

改动5:搞一个cards.cdb

https://github.com/mycard/ygopro-database

问题6:没有卡图、没有声音等其他问题

改动6:Github上搞点资源

https://github.com/

11. 总结

自己编译令人头大,所以为什么不直接用别人已经写好的一件安装包呢?:)

娱乐力量全开
萌卡平台
233服

最后为独立搓出来ygopro的圆神献上最高的敬意!

Respect!