把 Cocos2d-x v3.16 项目从 VS2017 迁移到 VS2026 那天,编译画面比我预想的惨烈得多。一按生成,几百条报错瞬间把输出窗口刷爆,绝大多数并不是业务逻辑问题,而是新工具链对十年前的老代码进行了一次系统性“清账”。如果你也正拿着一个历史悠久的 Cocos2d-x 项目,尝试在 VS2026 下编译,并被一串又一串的兼容性问题劝退,这篇文章大概能帮你省下两三天时间。
我折腾完这个流程后,把过程中和 VS2026、Cocos2d-x、编译、兼容性相关的所有实际操作原原本本记录下来,从环境准备、CMake 生成、报错修复到运行调试,全部按我实际执行的顺序写。这里没有奇技淫巧,都是能落地的常规操作。适合从旧版本迁移到 VS2026 的 Cocos2d-x 开发者,也适合准备接手老项目源码的维护人员。
1. 先说清楚:老版本 Cocos2d-x 遇上新编译器会出什么事
1.1 一次迁移引发的编译失败现场
项目的情况是这样:Cocos2d-x v3.16,很多年前在 VS2015 上编译运行都好好的,后来项目冻结,源码一直没动过。这次要在一台新机器上恢复维护,机器上装的已经是 VS2026,没有旧版本 VS 可用。
我一开始偷懒,双击了目录里的旧 cpp-tests.sln,VS 先是弹出一堆“需要安装组件”的提示,然后问我要不要做解决方案重定向。我全部点确定,选择最新的 v17x 平台工具集,重新生成解决方案。结果错误列表一下涌出来,我简单数了一下,主要类型有五类:
- C2873:
register不再允许被当成存储类说明符,sqlite3.c 和 zlib 里大量出现。 - C2039:
std::ptr_fun/std::unary_function不是std的成员,老模板代码里的惯用法被新标准库清理了。 - C4996:
strcpy、sprintf、fopen等被标成 deprecated,并且在新工程默认开启 SDL 检查后直接升级成了“错误”。 - LNK1104:链接阶段找不到
libcurl.lib、websockets.lib这类外部依赖库,因为 prebuilt 依赖没有正确配置。 - 一堆 C3646 之类的语法问题,集中在几个第三方头文件里,属于新 MSVC 对 C++ 解析更严格之后暴露出来的。
看到这个场面,我第一反应不是逐个改,而是先把“为什么会这样”搞清楚。因为如果底层逻辑不调整,改完这一批错误还会冒下一批。
1.2 VS2026 的新工具链对老引擎意味着什么
VS2026 带的 MSVC 编译器、Windows SDK、CMake 版本都比 Cocos2d-x v3.16 时代往前推进了好几个大版本。老引擎源码本质上还是 C++11/C++14 时期的写法,而新编译器在默认语言模式、标准库实现、安全警告策略上都激进得多。
具体来说,三件事影响最大。
第一,语言标准变了。C++17 移除了 std::auto_ptr、std::ptr_fun、std::unary_function、std::binary_function、register 关键字,C++20 又进一步移除了 std::result_of 和部分旧的函数绑定工具。Cocos2d-x 引擎主体代码大多规避了这些问题,但内置的第三方库没有,比如 sqlite3、libcurl、zlib、libwebsockets、luajit,甚至一些 extensions 模块里的模板代码,都会踩中。
第二,安全警告策略变了。VS2017 之后,新建工程默认开启 SDL 检查,/sdl 会把一批 CRT 安全警告升级为错误。老代码里大量使用 strcpy、sprintf、strcat,这些函数在新 MSVC 眼里全是“高危操作”,于是直接编译失败。明明在旧编译器上只是黄色波浪线,到了 VS2026 就成了硬错误。
第三,C++ 符合模式变了。VS2019 16.8 开始,MSVC 默认使用 /permissive-,很多以前能凑合通过的“不标准”代码会直接报错。例如隐式类型转换、成员函数指针匹配、模板参数推导二义性,老代码一旦踩中就是一片红。Cocos2d-x 3.16 那个年代并没有完全按 conformant 标准开发,所以在 VS2026 下先让 /permissive 反而更容易推进。
1.3 哪些项目适合用这套方案,哪些趁早别折腾
在动手之前,我建议你先判断一下自己的项目值不值得走这条路。
适合硬啃 VS2026 的项目,通常满足这几个条件:老项目必须长期维护,而且不能随便换引擎;客户端逻辑里依赖了大量引擎内置模块,升级引擎的成本远大于改编译错误的成本;团队里有能看懂 C++ 模板报错的人,至少能分清“源码 bug”和“标准库差异”。
不适合折腾的项目,往往是这种情况:项目只是在做原型验证,换个新版本引擎成本更低;或者老项目里混了一堆自己都说不清来源的第三方补丁,改一处崩三处。这时候与其硬啃 VS2026 兼容性,不如直接把引擎升级到 4.x,或者用 LTS 版本重新搭工程。
我这次的项目属于第一种,所以选择了硬啃。下面从环境准备开始,把每一步都过一遍。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备和源码获取:这里容易埋暗雷
2.1 安装 VS2026 时勾选哪些组件
VS2026 默认只装 C#/F# 和 Web 工作负荷,C++ 相关组件必须手动勾。我在装的时候踩过一个坑:只勾了“使用 C++ 的桌面开发”,没有勾“适用于最新生成工具的 C++ CMake 工具”,结果 CMake 生成时找不到生成器,最后还是回头补装了组件。
建议至少勾选这几项:
- 使用 C++ 的桌面开发。
- 适用于 Windows 的 C++ CMake 工具。
- 最新版 Windows 10/11 SDK,建议选一个稳定的版本,不要选 Preview 版。
- MSBuild 生成工具(如果后面想用命令行编译的话)。
- 如果是纯 Win32 客户端,不用装 Android 组件,省不少磁盘空间。
组件装完之后,注意检查一个位置:VS 安装器里
