VS2026 编译 Cocos2d-x 项目完整指南:解决兼容性问题

本文详细记录了使用 Visual Studio 2026 编译 Cocos2d-x 老项目时遇到的各种兼容性问题及解决方案,包括 uint64_t 重定义、std::function 未定义、std::ostream 类型错误等问题。

一、问题背景

Visual Studio 2026(MSVC 14.50)发布后,许多旧的 Cocos2d-x 项目在编译时遇到了严重的兼容性问题。本文以 GloryProject 项目为例,详细记录编译过程中遇到的所有问题及解决方案。

**开发环境:**

  • Visual Studio 2026 Enterprise (MSVC 14.50.35717)

  • Cocos2d-x 3.x

  • Windows 10/11

  • 编译配置:Debug / Win32

二、编译错误及解决方案

2.1 bullet 库 uint64_t 重定义错误

**错误信息:**

```

error C2371: "uint64_t": 重定义;不同的基类型

BulletMultiThreaded\PlatformDefinitions.h(46,29): error C2371: "uint64_t": 重定义

```

**问题原因:** VS2026 的 `<stdint.h>` 已经提供了 `uint64_t` 类型定义,但 bullet 库的 `PlatformDefinitions.h` 又自定义了一份。

**解决方案:**

  1. 修改 `libbullet.vcxproj`,添加预处理器定义:

```xml

<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;__BT_SKIP_UINT64_H;%(PreprocessorDefinitions)</PreprocessorDefinitions>

```

  1. 修改 `BulletMultiThreaded\PlatformDefinitions.h`:

```cpp

#ifndef __BT_SKIP_UINT64_H

#if defined(_WIN64) && defined(_MSC_VER)

typedef unsigned __int64 uint64_t;

#elif defined(_M_ARM)

typedef unsigned __int64 uint64_t;

#else

typedef unsigned long int uint64_t;

#endif

#else

// Use standard uint64_t from stdint.h

#include <stdint.h>

#endif

```


2.2 std::function 未定义错误

**错误信息:**

```

error C2039: "_Pi": 不是 "std" 的成员

error C2065: "function": 未声明的标识符

```

**问题原因:** VS2026 标准库更严格,需要显式包含 `<functional>` 头文件。

**解决方案:** 在以下文件中添加 `#include <functional>`:

  • `cocos\audio\win32\AudioCache.h`

  • `cocos\audio\win32\AudioPlayer.h`

  • `cocos\audio\win32\AudioEngine-win32.h`

```cpp

#include <string>

#include <mutex>

#include <vector>

#include <functional> // 添加此行

```


2.3 std::_Pi 未定义错误

**错误信息:**

```

error C2039: "_Pi": 不是 "std" 的成员

error C2065: "_Pi": 未声明的标识符

```

**问题原因:** VS2026 移除了 `std::_Pi` 非标准扩展。

**解决方案:** 修改 `Classes\cryptk\mathext.h`:

```cpp

#ifndef M_PI

#define M_PI 3.14159265358979323846

#endif

static double to_rad(double degrees)

{

return ( (degrees) * M_PI / 180 );

}

static double to_deg(double radians)

{

return ( (radians) * 180 / M_PI );

}

```


2.4 std::ostream 类型未定义错误

**错误信息:**

```

error C2027: 使用了未定义类型"std::basic_ostream<char,std::char_traits<char>>"

error C2065: "iostate": 未声明的标识符

error C2065: "badbit": 未声明的标识符

```

**问题原因:** VS2026 的 `<__msvc_string_view.hpp>` 内部依赖 `<iosfwd>` 前置声明,但旧代码没有正确包含。

**解决方案:**

  1. 在核心头文件中添加 `<iosfwd>` 前置声明:

```cpp

// cocos\platform\CCPlatformConfig.h

#ifndef BASE_CC_PLATFORM_CONFIG_H

#define BASE_CC_PLATFORM_CONFIG_H

#include <iosfwd> // 添加此行

/**

Config of cocos2d-x project, per target platform.

THIS FILE MUST NOT INCLUDE ANY OTHER FILE

*/

```

  1. 在以下文件中同样添加:
  • `cocos\base\ccConfig.h`

  • `cocos\platform\CCPlatformMacros.h`

  • `cocos\platform\win32\CCStdC-win32.h`

  1. 在项目配置中强制包含头文件:

```xml

<ForcedIncludeFiles>iostream;algorithm</ForcedIncludeFiles>

```


2.5 外部库链接错误

**错误信息:**

```

LINK : fatal error LNK1181: 无法打开输入文件"libbullet.lib"

LINK : fatal error LNK1181: 无法打开输入文件"libSpine.lib"

```

**问题原因:** libcocos2d.vcxproj 的库目录配置不包含外部库的输出路径。

**解决方案:** 修改 `cocos\2d\libcocos2d.vcxproj`:

```xml

<Link>

<AdditionalLibraryDirectories>

$(OutDir);

(SolutionDir)..\\..\\external\\bullet\\proj.win32\\(Configuration).win32;

(SolutionDir)..\\..\\external\\Box2D\\proj.win32\\(Configuration).win32;

(SolutionDir)..\\..\\external\\recast\\proj.win32\\(Configuration).win32;

(SolutionDir)..\\..\\cocos\\editor-support\\spine\\proj.win32\\(Configuration).win32;

%(AdditionalLibraryDirectories)

</AdditionalLibraryDirectories>

</Link>

```


2.6 命名空间不明确错误

**错误信息:**

```

error C2872: "experimental": 不明确的符号

```

**问题原因:** `using namespace experimental;` 与 cocos2d 的命名空间冲突。

**解决方案:** 修改 `Classes\AppDelegate.cpp`:

```cpp

// 修改前

using namespace experimental;

// 修改后

using namespace cocos2d::experimental;

```


2.7 文件编码损坏问题

**问题描述:** 编辑文件时出现乱码,导致预处理指令被破坏。

**解决方案:** 使用 UTF-8 编码重新保存文件,并移除中文注释:

```cpp

// 修改前

//win32 不加密

#if CC_TARGET_PLATFORM != CC_PLATFORM_WIN32

//加密

luaStack->setLuaStackCryTo(this);

#endif

// 修改后

#if CC_TARGET_PLATFORM != CC_PLATFORM_WIN32

luaStack->setLuaStackCryTo(this);

#endif

```


三、完整编译步骤

3.1 编译外部库

```batch

编译 libSpine

msbuild cocos2d-x\cocos\editor-support\spine\proj.win32\libSpine.vcxproj ^

/p:Configuration=Debug /p:Platform=Win32 /t:Rebuild

```

3.2 编译主项目

```batch

使用短路径避免空格问题

msbuild runtime-src\proj.win32\GloryProject.vcxproj ^

/p:Configuration=Debug /p:Platform=Win32 /t:Rebuild

```

3.3 启动程序

```batch

程序输出位置

C:\Users\Administrator\Desktop\client\run\debug\win32\GloryProject.exe

```


四、修改文件清单

| 文件路径 | 修改内容 |

|---------|---------|

| `external\bullet\proj.win32\libbullet.vcxproj` | 添加 `__BT_SKIP_UINT64_H` 定义 |

| `external\bullet\BulletMultiThreaded\PlatformDefinitions.h` | 添加 `<stdint.h>` 包含 |

| `cocos\audio\win32\AudioCache.h` | 添加 `<functional>` |

| `cocos\audio\win32\AudioPlayer.h` | 添加 `<functional>` |

| `cocos\audio\win32\AudioEngine-win32.h` | 添加 `<functional>` |

| `cocos\platform\CCPlatformConfig.h` | 添加 `<iosfwd>` |

| `cocos\base\ccConfig.h` | 添加 `<iosfwd>` |

| `cocos\platform\CCPlatformMacros.h` | 添加 `<iosfwd>` |

| `cocos\platform\win32\CCStdC-win32.h` | 添加 `<iosfwd>` |

| `cocos\2d\libcocos2d.vcxproj` | 添加外部库目录路径 |

| `Classes\cryptk\mathext.h` | 使用 `M_PI` 替代 `std::_Pi` |

| `Classes\AppDelegate.cpp` | 修复命名空间、变量作用域 |

| `proj.win32\stdafx.h` | 添加 `<iosfwd>`, `<iostream>`, `<sstream>` |

| `proj.win32\SimulatorWin.cpp` | 添加 `<iostream>` |

| `proj.win32\GloryProject.vcxproj` | 添加 `/FIiostream;algorithm` |


五、编译警告处理

编译过程中会出现大量警告,以下是主要类型及处理方法:

| 警告类型 | 数量 | 处理建议 |

|---------|------|---------|

| C4005 宏重定义 | 1000+ | SDK 与 VS 头文件冲突,可忽略 |

| C4996 已否决声明 | 100+ | Cocos2d-x 旧 API,可忽略 |

| C4018 有符号/无符号不匹配 | 50+ | 代码逻辑问题,建议修复 |

| C4305 类型截断 | 20+ | double 转 float,可忽略 |

| LNK4099 未找到 PDB | 20+ | 调试符号缺失,可忽略 |


六、经验总结

6.1 VS2026 主要变化

  1. **标准库更严格**:需要显式包含所有使用的头文件

  2. **移除非标准扩展**:如 `std::_Pi`

  3. **头文件依赖变化**:`<string_view>` 需要 `<iosfwd>` 前置声明

  4. **类型定义冲突**:`<stdint.h>` 与自定义类型冲突

6.2 建议

  1. **优先使用 VS2022**:VS2026 与旧项目兼容性较差

  2. **开启强制包含头文件**:`/FIiostream` 可解决大部分问题

  3. **统一编码格式**:使用 UTF-8 避免文件编码问题

  4. **分步编译**:先编译外部库,再编译主项目


七、参考资源

  • Cocos2d-x 官方文档\](https://www.cocos.com/)

  • Bullet Physics 库\](https://pybullet.org/)

**作者**:林宏权

**发布时间**:2026 年 3 月 20 日

*如果本文对您有帮助,欢迎点赞、收藏、转发!*

相关推荐
天人合一peng7 小时前
unity 生成标记根据背景色变色为明显的颜色
unity·游戏引擎
魔士于安8 小时前
Unity 超市总动员 超市收银台 超市货架 超市购物手推车 超市常见商品
游戏·unity·游戏引擎·贴图·模型
CandyU28 小时前
Unity —— 数据持久化
unity·游戏引擎
zh路西法8 小时前
【Unity实现Oneshot胶卷显形】游戏窗口化与Win32API的使用
游戏·unity·游戏引擎
迪捷软件9 小时前
显控系统虚拟仿真的工程化路径
游戏引擎·cocos2d
笑虾13 小时前
TexturePacker 自定义数据格式导出
cocos2d·texturepacker
Swift社区13 小时前
传统游戏引擎 vs 鸿蒙 System 架构
架构·游戏引擎·harmonyos
mxwin1 天前
Unity Shader 半透明物体为什么不能写入深度缓冲?
unity·游戏引擎·shader
晚枫歌F1 天前
三层时间轮的实现
网络·unity·游戏引擎
努力长头发的程序猿1 天前
Unity使用ScriptableObject序列化资源
unity·游戏引擎