编译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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • feisky云计算、虚拟化与Linux技术笔记posts - 1014, comments - 298, trac...
    不排版阅读 3,754评论 0 5
  • 5.3 Windows安装说明 译者:Python 文档协作翻译小组,原文:Windows Installatio...
    布客飞龙阅读 1,576评论 0 4
  • 一只野狼卧在草上勤奋地磨牙,狐狸看到了,就对它说:天气这么好,大家在休息娱乐,你也加入我们队伍中吧!野狼没有说话,...
    昂立国际教育only阅读 590评论 0 2
  • 你我携手在星光中沉醉 恍惚中看见这夜色潋滟 我等待着 等待着 不管是谁走了谁要来 花开的声音在弥漫 喜悦也颤动着心...
    东归雀阅读 506评论 0 50