环境
Macbook pro M1 Max
MacOS 15.6.1
引擎分支 v4
Commit 7a5282a301a13e467bdcc3466d3cd3883862aadf
坑一、Clone 仓库
按照官方 Readme 的说明,repo clone 下来之后,需要再拉取一下 submodule,但是按照文档中的操作是无法顺利完成 submodule 的初始化的。
issues: https://github.com/cocos2d/cocos2d-x/issues/20714
需要修改 submodule 的地址,将 git:// 改为 git@ 或者 https:// 才能顺利完成 submodule 的初始化。
坑二、Python 版本
新版本的 Mac 已经不提供 Python2 了,并且 brew 也已经只能安装 Python3 了,但是引擎的工具脚本只支持 Python2。
我一开始尝试修改 Python 代码,去支持 3.x 版本,但是发现工作量还不小,最后还是决定去装一个 2.7。
需要去官网下载安包:https://www.python.org/downloads/macos/
坑三、生成 XCode 工程
创建工程需要 cmake 的命令行工具,可以用 brew 安装
brew install cmake
创建好项目之后,如果安装文档里的操作直接 cocos run 这个项目,会编译失败。
这个时候不要慌,一步一步解决问题。
先用最单纯的 cmake 命令生成出 xcode 工程,再根据编译的报错去解决问题
cmake .. -GXcode -DCMAKE_SYSTEM_NAME=iOS
坑四、编译失败
1. iconv
/Users/wangxiaochen/work/DynamicProjects/testgame/TestGame/cocos2d/cocos/2d/CCFontAtlas.cpp:132:9: error:
no matching function for call to 'iconv_close'
132 | iconv_close(_iconv);
| ^~~~~~~~~~~
In file included from /Users/wangxiaochen/work/DynamicProjects/testgame/TestGame/cocos2d/cocos/2d/CCFontAtlas.cpp:29:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator18.5.sdk/usr/include/iconv.h:74:5: note:
candidate function not viable: cannot convert argument of incomplete type
'void *' to 'iconv_t' (aka '__tag_iconv_t *') for 1st argument
74 | int iconv_close(iconv_t);
| ^ ~~~~~~~
/Users/wangxiaochen/work/DynamicProjects/testgame/TestGame/cocos2d/cocos/2d/CCFontAtlas.cpp:265:13: error:
no matching function for call to 'iconv'
265 | iconv(_iconv, (char**)&pin, &inLen, &pout, &outLen);
| ^~~~~
In file included from /Users/wangxiaochen/work/DynamicProjects/testgame/TestGame/cocos2d/cocos/2d/CCFontAtlas.cpp:29:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator18.5.sdk/usr/include/iconv.h:71:8: note:
candidate function not viable: cannot convert argument of incomplete type
'void *' to 'iconv_t' (aka '__tag_iconv_t *') for 1st argument
71 | size_t iconv(iconv_t, char ** __restrict,
| ^ ~~~~~~~
2 errors generated.
目前的代码直接编译是无法通过的,因为 iconv 的 API 参数调整了,第一个参数的类型强制使用 iconv_t,而引擎源码中还是 void*,所以全局搜一下 _iconv 把生命的类型修改成 iconv_t 就可以了。
2. iOS Deployment Target
clang++: error: SDK does not contain 'libarclite' at the path '/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphoneos.a'; try increasing the minimum deployment target
Command Ld failed with a nonzero exit code
之后在链接阶段,会报 SDK 不包含某个库的错误,其实是因为工程文件中目标 iOS 版本过低导致的,需要在 Build Settings 中将 iOS Deployment Target 的版本提高,目前应该最低为 iOS 15。
坑五、生成执行文件
无法安装“TestGame”
Bundle at path /var/installd/Library/Caches/com.apple.mobile.installd.staging/temp.SxnsZY/extracted/TestGame.app has missing or invalid CFBundleExecutable in its Info.plist
编译通过之后还需要解决一下执行文件的问题,否则包无法正常安装。
需要将 Info.plist 中的 CFBundleExecutable 的值改成项目的名字。