OpenTTD 编译实战:依赖库、CMake 构建流程与 Windows/多平台调试选项
游戏开发【免费下载链接】OpenTTDOpenTTD is an open source simulation game based upon Transport Tycoon Deluxe项目地址https://gitcode.com/gh_mirrors/op/OpenTTD点击查看免费下载OpenTTD基于 Transport Tycoon Deluxe 的开源运输模拟游戏的编译体系以 CMake 为核心Windows 平台通过 Visual Studio vcpkg 管理依赖其他平台则直接使用系统库。本文基于仓库中的 COMPILING.md 完整继承其编译步骤与参数说明并结合 CMakeLists.txt、cmake/Options.cmake、vcpkg.json 等构建脚本逐一印证底层实现帮助你在任意平台上独立完成 OpenTTD 的构建、定制无 GUI 服务端版本以及为调试 desync 等疑难问题配置专用编译开关。依赖库必需、建议与可选三级分类OpenTTD 对第三方库采取“全部可选、缺失时降级功能”的策略。官方文档将依赖分为两类列表含义如下通用依赖所有平台库级别用途breakpad建议安装程序崩溃时生成 minidump 转储zlib建议安装解压缩旧版0.3.0–1.0.5存档、内容下载、高度图liblzma建议安装解压缩 1.1.0 及之后的存档libpng建议安装截图与高度图加载liblzo2可选解压缩 0.3.0 之前更古老的存档Linux 平台额外依赖库级别用途libcurl建议安装内容下载Windows 用 WinHttpEmscripten 用 JavaScript 实现 HTTPlibSDL2必需级硬件访问视频、声音、鼠标libfreetype必需级加载与渲染通用字体libfontconfig必需级字体查找与字体名解析harfbuzz必需级右起文字脚本阿拉伯文、波斯文等依赖 libiculibicu必需级右起文字脚本与字符串自然排序如果你只编译 dedicated server专用服务端文档指出最后四项字体/脚本相关库可以不需要。这一点在构建脚本中得到印证CMakeLists.txt 中所有 GUI 相关库的find_package调用都被包裹在if(NOT OPTION_DEDICATED)分支内专用服务端构建会完全跳过 SDL2、Freetype、Harfbuzz、ICU 等探测反过来在 CMakeLists.txt 中非 macOS 的 UNIX 平台若既未找到 SDL2 也未找到 Allegro会直接FATAL_ERROR终止配置HarfBuzz/ICU 缺失则只发出“无法正确渲染右起文字”的警告而非报错。文档还强调了一个关键事实OpenTTD 不强制要求任何上述库存在但缺少 liblzma 将无法打开 1.1.0 之后的绝大多数存档缺少 zlib 则无法打开多数旧存档且内容下载系统不可用。构建脚本通过link_package(... ENCOURAGED)机制见 CMakeLists.txt 中 PNG、ZLIB、LibLZMA 的ENCOURAGED标记而 LZO 不带该标记把“建议/可选”这一语义直接编码进了链接逻辑。仓库根目录的 vcpkg.json 则是用 vcpkg 构建时的依赖清单跨平台依赖 breakpad、liblzma、libpng、lzo、zlib、opusfile、soxrLinux 平台另加 curl、fontconfig、freetype、harfbuzz、icu、sdl2、dbus。Windows 平台构建工具链准备Windows 构建需要 Microsoft Visual Studio 2022 或更新版本Community 免费版即可并需要 Platform SDK——可在安装 Visual Studio 时勾选Visual C MFC for x86 and x64视版本可能还需Visual C ATL for x86 and x64一并安装否则需单独安装 Windows SDK。使用 vcpkg 安装依赖OpenTTD 在 Windows 上的依赖通过 vcpkg 工具管理。按 vcpkg 官方 Quick Start 安装工具后建议安装**静态static**版本的依赖文档列出的清单为breakpadliblzmalibpnglzozlib同时安装 x6464 位与 x8632 位两种变体实际只需其一的命令.\vcpkg install --tripletx64-windows-static .\vcpkg install --tripletx86-windows-static这里选 static triplet 并非仅仅为了省事CMakeLists.txt 中有配套逻辑——当VCPKG_TARGET_TRIPLET以-static结尾且不包含-md时主程序与测试目标的 C 运行库会被自动切换为多线程静态版/MTDebug 下为/MTd若使用-static-md结尾的 triplet则保持动态运行库/MD。生成工程文件并编译两种可行方式直接在 IDE 中打开源码目录作为 CMake 项目CMake 会被自动检测可直接编译。若依赖已安装但未被找到需要在 CMake 参数中设置VCPKG_TARGET_TRIPLETVisual Studio 2022 还需设置CMAKE_TOOLCHAIN_FILEMSVC 工程文件的命令行示例给出了典型取值。通过 CMake 生成 MSVC 工程文件需要下载 CMake 或使用 vcpkg 自带版本mkdir build cd build cmake.exe .. -GVisual Studio 17 2022 -DCMAKE_TOOLCHAIN_FILElocation of vcpkg\vcpkg\scripts\buildsystems\vcpkg.cmake -DVCPKG_TARGET_TRIPLETx64-windows-static将location of vcpkg替换为 vcpkg 的安装位置。执行后 build 目录中生成 MSVC 工程文件MSVC 还可以通过工程中的ZERO_CHECK项目自行重建rebuild这些文件。其他平台Linux / macOS 等CMake make除 Windows 外的平台统一走 CMake 流程。文档给出的最低 CMake 要求是 3.16需要注意当前仓库顶层 CMakeLists.txt 实际声明cmake_minimum_required(VERSION 3.17)且配置阶段禁止在源码目录内直接构建CMakeLists.txt 会对 in-source build 直接报FATAL_ERROR因此务必使用独立的 build 目录。默认构建为Debug 且启用断言CMakeLists.txt 中未指定CMAKE_BUILD_TYPE时显式设为Debug文档提醒这比 Release 构建慢得多。标准流程mkdir build cd build cmake .. make关于如何切换为 Release 构建、使用哪些 CMake 交互参数文档建议直接阅读 CMake 官方手册的 user interaction 章节此处不展开。CMake 选项四种构建形态通过 CMake 参数可以影响构建形态文档列出四个常用选项选项效果源码级说明-DCMAKE_BUILD_TYPERelWithDebInfo构建 Release 版本。比 Debug 快得多但崩溃时的调试信息少很多非 Debug 配置下 cmake/CompileFlags.cmake 会自动追加-D_FORTIFY_SOURCE2-DOPTION_DEDICATEDON构建无 GUI 的 OpenTTD适合无头服务器所需库更少cmake/Options.cmake 中追加-DDEDICATED宏CMakeLists.txt 据此跳过全部 GUI 依赖探测-DOPTION_USE_ASSERTSOFF关闭断言。需谨慎使用因为 assert 能捕捉问题的早期征兆Release 构建默认关闭cmake/Options.cmake开启时定义WITH_ASSERT关闭时定义NDEBUG-DOPTION_TOOLS_ONLYON只构建strgen等工具不构建游戏本体适合交叉编译CMakeLists.txt 中该选项会提前return()只加入src子目录的工具目标除上述四个文档重点介绍的选项外cmake/Options.cmake 中还定义了若干构建期可配置的开关配置完成后会由show_options()打印当前取值例如OPTION_PACKAGE_DEPENDENCIES把依赖库拷贝进lib/便于打包仅 Linux 可用OPTION_INSTALL_FHS按 FHS 目录结构安装Linux 默认开启OPTION_FORCE_COLORED_OUTPUT强制 ANSI 彩色编译输出GNU/Clang 专用配合 cmake/CompileFlags.cmakePERSONAL_DIR/SHARED_DIR/GLOBAL_DIR个人/共享/全局数据目录在 CMakeLists.txt 中若设置了前两项会编译进WITH_PERSONAL_DIR/WITH_SHARED_DIR宏各平台默认值见 cmake/Options.cmake如 Linux 个人目录默认~/.openttdmacOS 默认Documents/OpenTTD。支持的编译器文档给出的原则是任何受 CMake 支持且支持 C20 的编译器都应能编译 OpenTTD具体编译器清单随时间变化需查阅编译器手册确认 C20 支持、查阅 CMake 确认对编译器的支持。仓库侧的硬性约束在 CMakeLists.txtCMAKE_CXX_STANDARD 20且CMAKE_CXX_STANDARD_REQUIRED YES、关闭 C 扩展CMAKE_CXX_EXTENSIONS NO。另外从 cmake/CompileFlags.cmake 的源码结构看项目目前只为 MSVC、GNU、Clang、AppleClang 四类编译器定义了警告选项MSVC 使用/W3等GCC/Clang 使用-Wall -Wextra -Wformat2等一组严格警告遇到未适配的编译器会在配置阶段直接报FATAL_ERROR并提示提交 PR 增加支持——这解释了文档为何把“CMake 是否支持你的编译器”作为前提条件之一。基础集Base Set编译避免污染源码树要重新编译使用原版 Transport Tycoon Deluxe 图形所需的附加图形还需要安装 GRFCodec内含 NFORenum工具。文档特别警告了两个副作用GRF 重新生成检测到 GRFCodec 后构建过程会重新生成.grf文件并写回源码目录使仓库处于被修改状态不同版本的 GRFCodec 可能产生二进制差异翻译缺口若基础集新增的翻译尚未纳入基础集的信息文件重新生成也会带来差异。探测逻辑在 cmake/FindGrfcodec.cmake依次find_program查找grfcodec、grfid、nforenum三者齐全才认为Grfcodec可用。文档给出的规避方法是在 CMake 缓存中显式禁用这两个变量# 在 build 目录执行或在 cmake 命令中传入 cmake .. -DGRFCODEC_EXECUTABLEGRFCODEC_EXECUTABLE-NOTFOUND -DNFORENUM_EXECUTABLENFORENUM_EXECUTABLE-NOTFOUND即把GRFCODEC_EXECUTABLE和NFORENUM_EXECUTABLE设为 CMake 的“未找到”值构建将跳过基础集重新生成保持源码树干净。开发者调试编译开关CXXFLAGSCOMPILING.md 列出的最后一组技巧是通过CXXFLAGS直接控制编译标志任意组合均可标志作用-DRANDOM_DEBUG辅助调试 desync不同玩家随机数发散问题-fno-inline禁止生成内联函数显著降低调试难度-O0关闭全部优化显著降低调试难度-p开启性能剖析profiling其中-DRANDOM_DEBUG的作用范围可以从源码直接确认它在 src/core/random_func.cpp 中拦截核心随机数生成、在 src/debug.cpp 中影响调试输出、并在 src/network/network_internal.h 中为网络相关随机量打标记——与仓库中 desync 调试文档docs/desync.md、docs/debugging_desyncs.md所描述的排查流程相衔接。文档同时强调一条容易踩坑的规则修改CXXFLAGS时必须使用全新的 build 目录因为该值会被 CMake 缓存。示例用法CXXFLAGS-fno-inline cmake ..小结一次可复现的完整构建综合以上各节一个典型的 Linux 开发环境构建Release、保留断言以便抓崩溃、跳过基础集重生成可以写成mkdir build cd build cmake .. -DCMAKE_BUILD_TYPERelWithDebInfo \ -DGRFCODEC_EXECUTABLEGRFCODEC_EXECUTABLE-NOTFOUND \ -DNFORENUM_EXECUTABLENFORENUM_EXECUTABLE-NOTFOUND make构建完成后除openttd主程序外还会生成openttd_test测试目标CMakeLists.txt测试通过 CTest/Catch2 发现并注册CMakeLists.txt可用ctest在 build 目录内运行以验证构建结果。整套流程与参数细节以 COMPILING.md 为准构建行为细节以 CMakeLists.txt 与 cmake/ 目录下的脚本为准。赞分享游戏开发【免费下载链接】OpenTTDOpenTTD is an open source simulation game based upon Transport Tycoon Deluxe项目地址https://gitcode.com/gh_mirrors/op/OpenTTD点击查看免费下载相关推荐LuantiMinetest多平台编译指南CMake 构建选项全解析与 Linux/Windows/macOS 实战LuantiMinetest多平台编译指南CMake 构建选项全解析与 Linux/Windows/macOS 实战 导读 Luanti原 Minete游戏开发图形学使用 CMake 编译 Cataclysm-DDA构建流程、依赖清单与全部构建选项详解使用 CMake 编译 Cataclysm DDA构建流程、依赖清单与全部构建选项详解 Cataclysm DDACataclysm: Dark Days游戏开发Dogecoin 跨平台依赖构建系统depends实战指南从零编译多平台依赖与交叉编译配置Dogecoin 跨平台依赖构建系统depends实战指南从零编译多平台依赖与交叉编译配置 本文以 Dogecoin 仓库中的 depends 系统说明区块链上一篇CANN Ascend C SIMT bfloat16转换函数下一篇国家中小学智慧教育平台电子课本PDF批量下载离线存档教材的轻量工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

robot-dog-swarm-control 使用教程:服务端与客户端如何分工,让多只机器狗听令而同步

robot-dog-swarm-control 使用教程:服务端与客户端如何分工,让多只机器狗听令而同步

robot-dog-swarm-control 使用教程:服务端与客户端如何分工,让多只机器狗听令而同步 【免费下载链接】CupCode_robot-dog-swarm-control模块 源师兄扩展项目: 机器狗群控 | 由源师兄组织创建 项目地址: https://gitcode.com/yuanshixiong/robot-dog-sw…

2026/9/25 3:29:49 阅读更多 →
PCI简易通讯控制器黄标修复全指南

PCI简易通讯控制器黄标修复全指南

1. 黄色感叹号不是故障,而是Windows在向你发求救信号“PCI简易通讯控制器”这个名称听起来很陌生,但只要你打开设备管理器,展开“系统设备”或“其他设备”,大概率会看到它——一个带着黄色感叹号的灰色图标,名字里带着…

2026/9/25 3:29:49 阅读更多 →
JobOps AI Provider配置终极对比:OpenAI、Claude还是Ollama本地部署免费方案

JobOps AI Provider配置终极对比:OpenAI、Claude还是Ollama本地部署免费方案

JobOps AI Provider配置终极对比:OpenAI、Claude还是Ollama本地部署免费方案 【免费下载链接】job-ops job-ops: DevOps principles applied to job hunting. A self-hosted pipeline to track, analyze, and assist your application process 项目地址: https://…

2026/9/25 3:29:49 阅读更多 →

最新新闻

VisiData 列系统深度指南:Column 计算引擎、类型系统与聚合器实战

VisiData 列系统深度指南:Column 计算引擎、类型系统与聚合器实战

数据分析CLI数据可视化 【免费下载链接】visidata A terminal spreadsheet multitool for discovering and arranging data 项目地址: https://gitcode.com/gh_mirrors/vi/visidata 点击查看 免费下载 导读:本文围绕 VisiData 的 Column 体系展开&#…

2026/9/25 6:04:47 阅读更多 →
Plannotator External Annotations API:把外部工具的标注实时推送到活动评审会话

Plannotator External Annotations API:把外部工具的标注实时推送到活动评审会话

【免费下载链接】plannotator Annotate and review coding agent plans and code diffs visually, share with your team, send feedback to agents with one click. 项目地址: https://gitcode.com/gh_mirrors/pl/plannotator 点击查看 免费下载 Plannotator 的 E…

2026/9/25 6:04:47 阅读更多 →
pylibcudf 字符串 API 实战指南:capitalize / title / is_title 的用法与底层原理

pylibcudf 字符串 API 实战指南:capitalize / title / is_title 的用法与底层原理

数据分析数据工程机器学习 【免费下载链接】cudf cuDF - GPU DataFrame Library 项目地址: https://gitcode.com/gh_mirrors/cu/cudf 点击查看 免费下载 cuDF 的 pylibcudf 是 libcudf 的 Cython 绑定层,为 GPU 上的字符串处理提供直接且低开销的 Pyth…

2026/9/25 6:04:47 阅读更多 →
Kubebuilder 项目路线图全景解读:2024–2026 战略规划与源码落地

Kubebuilder 项目路线图全景解读:2024–2026 战略规划与源码落地

开发者工具代码生成CLI云原生后端 【免费下载链接】kubebuilder Kubebuilder - SDK for building Kubernetes APIs using CRDs 项目地址: https://gitcode.com/gh_mirrors/ku/kubebuilder 点击查看 免费下载 本指南以仓库 roadmap/ 目录中的官方路线图文档为核心&a…

2026/9/25 6:04:47 阅读更多 →
Xred木马深度剖析:传播链路、窃密行为与终端应急响应实战

Xred木马深度剖析:传播链路、窃密行为与终端应急响应实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 6:04:47 阅读更多 →
Atlas 300V Pro部署YOLO实战:昇腾推理卡模型转换与调优指南

Atlas 300V Pro部署YOLO实战:昇腾推理卡模型转换与调优指南

一块Atlas加速卡,到底算不算“运算加速卡”?这个问题我在不少群里见人问过,尤其是当你说到“atlas 300V 24G”这个型号的时候,很多人第一反应是:24G显存,那是不是类似游戏显卡那样做渲染加速的?…

2026/9/25 6:03:47 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →