想用C++写个modules,按照官方教程+Google一步步操作,并没有那么顺利,不过最终成功了。还是分享一下,万一也有人想入坑呢。 (滑稽脸.gif
编译问题
序号 | 问题 | 发生位置 | 解决办法 |
---|---|---|---|
1 | 找不到 config 模块 |
SConstruct文件的import config 那句 |
见代码片段1
|
2 | 找不到default_controller_mappings.h
|
main目录下 | 从github下载到对应位置 |
# 代码片段1
# 发生问题的代码
import config
if (config.can_build(selected_platform)):
config.configure(env)
env.module_list.append(x)
sys.path.remove(tmppath)
sys.modules.pop('config')
# 修改成如下(缺陷:假如你开发的module忘记配置config.py也不会报错,只能通过`no build`打印发现)
try:
import config
except ImportError:
print ("no build: " + tmppath)
else:
if (config.can_build(selected_platform)):
config.configure(env)
env.module_list.append(x)
sys.path.remove(tmppath)
sys.modules.pop('config')
细节
说下编译过程,windows平台如下。
- 克隆仓库到本地,
git clone https://github.com/godotengine/godot.git
- 切换到你要编译的tag,我选则了 2.1.4-stable,
git checkout 2.1.4-stable
直接克隆 2.1.4-stable 的版本
git clone -b 2.1.4-stable https://github.com/godotengine/godot.git
- 安装 python2.7,因为godot项目用到了编译工具scons,而它依赖于python。
- 安装 scons,去 官网下载 二进制安装文件既可。
- 安装VS C++环境,已有跳过。
- 打开VS的
Developer Command Prompt
执行编译指令,注意选择 x86 还是 x64 ,Native 还是 ARM。我选择的是x64 Native
。 - 切换到 godot 源码目录,执行编译指令
scons vsproj=yes platform=windows
- 发现问题 1,按照
代码片段1
所述方法解决。
该问题只发生于,编译了某个版本后,使用 git checkout 切换tag再次编译。比如我先编译一把 3.0.x,然后切到 2.1.4 编译就会发生这个错误。
- 发现问题 2,按照问题表格中所述方式解决。
- 等待编译完成,撒花~
解决问题思路
godot 编译依赖于 python 编译工具 scons,问题 1 发生时提示
ImportError: No module named config:
File "I:\godot\SConstruct", line 366:
import config
遇到这类问题的解决办法通常是,pip install 缺失的包
,但这次你这么做就会误入歧途。pip 确实能给安装上 config 包,但是,它会提示 config 模块没有 can_build
方法。
如果你阅读官方 Custom modules in C++
的教程,不难发现,自定义的模块需要定义 config.py、SCsub 两个文件去完成编译。而 config.py 文件刚好定义了 can_build(platform)
这样的函数。
阅读错误发生之前的代码,我注释出了思路
# 遍历模块
for x in module_list:
# 跳过没有enabled的模块
if env['module_' + x + '_enabled'] != "yes":
continue
# 拼出路径,`modules`目录下的
tmppath = "./modules/" + x
sys.path.append(tmppath)
# 不如打印一下这个路径
print ("tmppath:", tmppath)
env.current_module = x
import config
if (config.can_build(selected_platform)):
config.configure(env)
env.module_list.append(x)
sys.path.remove(tmppath)
sys.modules.pop('config')
加入打印路径的代码,再次运行编译指令,得到如下错误
i:\godot> scons vsproj=yes platform=windows
scons: Reading SConscript files ...
Detected MSVC compiler: amd64
Compiled program architecture will be a 64 bit executable (forcing bits=64).
tmppath: ./modules/bmp
ImportError: No module named config:
File "I:\godot\SConstruct", line 366:
import config
tmppath 显示 ./modules/bmp
,打开看看,发现没有C++源文件,也就是说并不需要被编译,而有些目录,比如 ./modules/ogg
目录下有C++源码,也有 config.py 和 SCsub,至此问题很清晰了。解决思路,删掉 ./modules
下所有没有代码的目录,
# 删除不在 git 版本中的文件
# 缺点:它会删掉你放在项目中的其他文件,以及你未commit的代码
git clean -d -x -f
或者写代码规避 import config
异常,我选择了后者。
总结
问题发生的原因是我先编译了 3.0.1 ,然后使用 git check 2.1.4-stable 切换,但编译生成的中间文件 *.obj 没有删除,这些本来在 tag:2.1.4-stable
没有的目录因此被保留下来,所有 ./modules
下的没源码目录中能看见 .obj 文件,而 scons 尝试编译该目录下的代码,发现没有 config.py ,于是报出错误 1。
这正是应了那句话:没有困难,创造困难也要上。(笑中含泪.jpg
网友评论