编译godot 2.1.x 遇到的问题

想用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平台如下。

  1. 克隆仓库到本地,git clone https://github.com/godotengine/godot.git
  2. 切换到你要编译的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

  1. 安装 python2.7,因为godot项目用到了编译工具scons,而它依赖于python。
  2. 安装 scons,去 官网下载 二进制安装文件既可。
  3. 安装VS C++环境,已有跳过。
  4. 打开VS的Developer Command Prompt执行编译指令,注意选择 x86 还是 x64 ,Native 还是 ARM。我选择的是 x64 Native
  5. 切换到 godot 源码目录,执行编译指令 scons vsproj=yes platform=windows
  6. 发现问题 1,按照 代码片段1 所述方法解决。

该问题只发生于,编译了某个版本后,使用 git checkout 切换tag再次编译。比如我先编译一把 3.0.x,然后切到 2.1.4 编译就会发生这个错误。

  1. 发现问题 2,按照问题表格中所述方式解决。
  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

你可能感兴趣的:(编译godot 2.1.x 遇到的问题)