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 日

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

相关推荐
林鸿群2 小时前
VS2026 编译 Cocos2d-x 老项目完整指南:从崩溃到完美运行
游戏引擎·cocos2d
风酥糖3 小时前
Godot游戏练习01-第15节-敌人生成动画,翻转,碰撞
游戏·游戏引擎·godot
呆呆敲代码的小Y4 小时前
Unity+AI 用一句话制作完整小游戏:飞翔的牛马【AI纯添加-0手工代码】
人工智能·游戏·unity·游戏引擎·游戏制作·unityai·一句话制作游戏
mxwin16 小时前
Unity Shader FLOWMAP岩浆流动制作案例
unity·游戏引擎·shader·uv
小贺儿开发17 小时前
【Arduino与Unity交互探究】01 摇杆模块
科技·unity·游戏引擎·arduino·串口通信·摇杆·硬件交互
Yasin Chen19 小时前
Unity TMP_SDF 分析(三)顶点着色器1
unity·游戏引擎·着色器
mxwin19 小时前
Unity Shader 使用 Noise 图 制作Shader 溶解效果
unity·游戏引擎
mxwin21 小时前
Unity Shader 用 Ramp 贴图实现薄膜干涉效果
unity·游戏引擎·贴图·shader·uv
魔士于安1 天前
Unity星球资源,八大星球,带fps显示
游戏·unity·游戏引擎·贴图·模型