☰
Windows10下编译Aseprite:从零配置到生成exe的完整指南
2026/10/19 2:58:51 网站建设 项目流程

如果你是一个喜欢折腾开源软件的人,八成早就听过 Aseprite。这款像素艺术编辑器在独立游戏圈基本是标配级别的工具,不过它官网直接卖的版本是要付费的,而源码却一直公开在官方仓库里,官方文档也明确支持用户自己编译使用。于是“Windows10 下编译 Aseprite”就成了很多开发者绕不开的一道坎。

先说结论:整个过程不复杂,核心就是三件事——配好 Visual Studio 环境、补齐构建工具链、处理 Skia 图形库依赖。但坑也集中在三处:子模块拉不齐、Skia 版本对不上、普通 cmd 里找不到编译器。这篇文章我就把从零到出现aseprite.exe的完整过程拆开讲一遍,顺手把我踩过的坑和排查思路也都记录下来。无论你是想白嫖一个可用的构建版,还是想改源码再编译出自己量身定制的版本,按这个流程走基本都能顺利跑通。

1. 编译前先弄明白几件事

1.1 为什么源码公开却偏要自己动手

Aseprite 的商业模式一直很有意思:源码完全公开在代码托管平台上,任何人都能拉下来看,但官方发布的安装包需要付费购买。如果你不想花钱买官方版,又不想用来路不明的第三方修改包,自己编译就是最稳妥的一条路。而且这不是钻空子,官方文档里就写了用户可以自行编译用于个人用途,属于官方认可的路线。

从技术角度看,自己编译还有一个额外的好处:你拿到的是一个干净、没有被乱七八糟的渠道动过手脚的二进制文件,运行环境可控。想加什么功能、改默认快捷键、调默认画布尺寸,都可以直接改源码重新编译,自由度比买官方版还高。对程序员来说,这也是一次完整的桌面软件构建实践——Aseprite 是个成熟的跨平台 C++ 项目,把它的 Windows 构建流程走通一遍,很多 CMake、依赖管理、编译器配置的经验都能迁移到别的项目上。

1.2 构建系统里的几个角色

开始之前,先把参与编译的这几个工具分个工,后面不会迷路。

CMake 是“总策划”,负责读取整个项目的构建规则,根据你的环境生成一套可执行的构建脚本。它不自己编译代码,而是把“怎么编译、链接哪些库、定义什么宏”这些信息整理好,交给下一棒。

Ninja 是“施工队长”。它读 CMake 生成好的脚本,调度几十上百个编译任务,并行跑起来,哪个文件先编译哪个后编译,都由它安排。Aseprite 在 Windows 上默认就是走 CMake + Ninja 这套组合,速度比 Visual Studio 自带的 MSBuild 快不少。

MSVC 编译器(cl.exe)是“干活的人”,负责把.cpp源码真正翻译成机器码。装 Visual Studio 时勾选“使用 C++ 的桌面开发”,就是为了把它和配套的 Windows SDK 装好。

Python 在这套流程里是个“万能杂工”。Aseprite 的构建脚本(比如gen.py)是用 Python 写的,构建过程中生成某些资源文件、处理版本号也需要它。所以必须确保 Python 3 能被命令行正常识别。

最后一个重量级角色是 Skia,这是 Google 开源的 2D 图形引擎,Aseprite 的渲染全靠它。Skia 不是普通依赖库,不能直接通过包管理器装完事,后面专门说。

1.3 磁盘、内存和耐心预算

编译这种体量的桌面软件,提前做好资源预判能省很多事。

源码本身不大,克隆仓库加子模块大概几百 MB。Skia 预编译包解压后一两个 GB。构建过程中生成的中间文件(.obj、.pdb、临时缓存)才是大头,综合下来整个工程占 5GB 以上很常见,建议留出至少 10GB 空间再动手。

内存方面,8GB 勉强能跑,但编译时最好别同时开着大型软件,不然内存爆掉编译器直接报错或者卡死。16GB 会比较舒服。

时间就更看机器了。CPU 好的机器可能 20 分钟搞定,普通笔记本或者机械硬盘,一小时甚至更久都正常。耐心点,编译 Aseprite 不是泡个面就能等完的活儿。

2. 环境准备:把工具链一次装齐

2.1 Visual Studio 2022 安装有讲究

Visual Studio 是整套工具链里最容易出错的一环。很多人电脑上早就有 VS,但装的时候没勾选 C++ 相关组件,结果编译时找不到cl.exe,离成功一步之遥却卡死在这儿。

装 VS 时,切记要选上“使用 C++ 的桌面开发”工作负载。这个组件会把 MSVC 编译器、标准库头文件、Windows 调试器都带进来。如果你是后来补装,打开 Visual Studio Installer,点“修改”,把这项勾上就行。同时建议把“Windows 10 SDK”也选上,Aseprite 构建过程中会用到系统头文件和库,没有 SDK 会出现各种奇怪的找不到头文件报错。

版本上建议直接用 2022 版,官方对较新 Visual Studio 的支持也最好,老版本编辑新源码很容易撞到语法兼容问题。安装完不用管具体启动什么项目模板,你需要的只是它附带的编译器环境。

另外一个很容易被忽略的点:VS 装完之后,“x64 本机工具命令提示符”这个入口通常会在开始菜单里出现,后面会用到,记住这个入口,别一直在普通 cmd 里折腾。

2.2 CMake、Ninja、Python:三个“小零件”

这三个工具没有 VS 那么重,但对编译必不可少。

CMake 装起来很省事。到官网下载 Windows 安装包,装的时候勾选“把 CMake 加入系统 PATH”,后面就能直接在终端里用cmake命令了。

Ninja 更轻量,下载某个版本其实也可以,但更推荐的做法是直接拉一个官方编译好的二进制文件,丢进一个目录,然后把那个目录加进 PATH。嫌麻烦的话,也可以借 VS 或 CMake 自带的组件,但我个人还是建议单独装一份,路径自己心里有数。

Python 要注意版本,Python 3 就行,官方对 Python 3 有明确支持。Windows 安装器会让你选择是否加入 PATH,这里记得勾上,而且建议选“为当前用户安装”,后面命令提示符识别起来不容易出问题。

装完在终端里逐个检查:

cmake --version ninja --version python --version

三个命令都有输出,说明环境基本就绪。如果有哪一个提示“不是内部或外部命令”,本质就是 PATH 没配好,去系统环境变量里把对应安装目录加上,然后重新打开终端。

2.3 编译时到底该用哪个终端

这一步很多人栽过,我一开始也犯过这个错:VS 装了,工具也装了,结果在普通 CMD 或者 PowerShell 里跑命令,死活提示找不到cl。

原因是普通终端根本没有继承 Visual Studio 的环境变量。VS 的编译器环境需要初始化一堆变量,包括INCLUDE、LIB这些,只有通过 VS 提供的“x64 Native Tools Command Prompt for VS 2022”打开的命令行才自动带齐。

所以规范做法是:到开始菜单搜“x64 Native Tools”,打开这个专门的命令提示符窗口,后续的python gen.py、cmake --build全都在这一个窗口里执行,省心很多。

如果不小心关了这个窗口,后面任何环境变量修改都要重开终端才生效。想验证当前终端是不是正确的环境,运行一句:

where cl

能输出版本信息就说明 MSVC 环境已经就绪。这一步通过了,后面编译流程才稳。

3. 源码与 Skia 依赖:最容易翻车的一段路

3.1 拉取源码并保证子模块齐全

Aseprite 不是单仓库就完事的,它引用了好几个独立维护的库(比如laf这个基础库、clipboard 剪贴板库等),全部通过 Git 子模块方式引入。如果你只拉主仓库,不拉子模块,构建时一定会报“找不到某某头文件”。

推荐的命令是:

git clone --recursive <官方仓库地址> aseprite

--recursive参数会在克隆主仓库后自动把子模块也拉一遍。如果已经克隆过了,就在仓库根目录补一句:

git submodule update --init --recursive

拉完之后花几秒钟检查一下仓库根目录下的目录结构,正常情况下会看到src/、data/、laf/、clipboard/这些关键目录都在。缺了哪个,顺手再同步一次子模块,别等编译报错再回来找原因。

3.2 Skia 预编译库的正确下载姿势

Skia 是整个编译里最容易让人卡住的一环。Aseprite 用的不是谷歌官方原版 Skia,而是一个专门维护的修改分支,所以你在 Skia 官网随便下载的版本没用,必须用 Aseprite 官方同步的预编译包。

操作上,去 Aseprite 官方仓库的 release 页面找对应的预编译 Skia 压缩包。注意版本匹配:仓库 main 分支对应哪个 Skia 预编译包,页面一般有明确对应关系,别下载一个过期或者不匹配的版本,不然链接阶段会报一堆没法解析的外部符号。

下载后解压,目录结构类似一个普通 SDK,里面有include/和lib/这样的目录。后面配置时SKIA_DIR环境变量指向的就是这个解压根目录,所以路径要记清楚,后面要用。

有些朋友可能想顺便把 Skia 也自己编译一遍,觉得更可控。但我的建议是:新手别碰这条线。Skia 是一个超级大块头,自己编不仅耗时长,依赖项也多,一整套搞下来难度翻好几倍。官方预编译包完全够用,没必要自讨苦吃。

3.3 目录规划与环境变量设置

Windows 路径里有几个坑,提前避免能省很多排查时间。首先,整个工程路径里不要有中文和空格,同样也不要放在中文用户名下的桌面、文档目录。比如C:\Users\张三\Desktop\Aseprite 源码这种路径,CMake 解析起来特别容易出幺蛾子。

我习惯把目录规划成这种清爽的结构:

D:\dev\ aseprite\ # 源码仓库 aseprite-deps\ skia\ # Skia 解压根目录

源码路径固定后,设置SKIA_DIR环境变量。Windows 下可以用系统属性里的环境变量面板加一个用户变量,值填 Skia 的根目录。或者图省事的话直接在命令行窗口里临时设置:

setx SKIA_DIR "D:\dev\aseprite-deps\skia"

注意setx设置完之后,当前已经打开的终端是拿不到新变量的,需要重开一个终端窗口才生效。你用echo %SKIA_DIR%能看到正确路径,就代表环境变量就位了。

3.4 源码更新的同步逻辑

Aseprite 迭代速度不慢,如果过一段时间发现你编译好的版本旧了,想更新到最新源码,别只简单git pull。正确操作是:

git pull git submodule update --init --recursive

然后,Skia 也可能需要跟着更新。因为新版源码很可能用到了新 Skia 分支里的新接口,旧预编译包在链接阶段会报错。所以每次把源码更新后,最好也重新下载 release 页面对应版本的预编译 Skia,更新SKIA_DIR指向,再重新走一遍后续的配置与构建流程。这个概念理解了,后面维护自己的构建版本会很顺手。

4. 配置构建工程:用 gen.py 把一切串起来

4.1 gen.py 在 Windows 下的独特地位

Aseprite 官方在 Windows 上的推荐构建方式,不是直接手敲cmake命令,而是先跑一个仓库自带脚本gen.py。它位于源码根目录(或者scripts/目录下,不同版本位置可能略有差异)。

这个脚本本质上就是一个辅助封装,帮你在当前环境里调用 CMake,把依赖路径、构建目录、生成器类型等参数一次性准备好。Windows 下面的路径解析、环境变量传递、生成器选择等细节,脚本都代为处理了,比手动敲 CMake 命令少踩不少坑。

当然,也可以完全手动走 CMake 的配置流程,但那样需要你自己把SKIA_DIR、版本号、架构参数全部传对,少传一个就是无休止的报错。务实一点,乖乖用官方提供的脚本。

4.2 运行 gen.py 并理解生成流程

在“x64 Native Tools Command Prompt for VS 2022”里,先进入源码根目录,确认SKIA_DIR环境变量没问题,然后执行:

python gen.py --vs vs2022

如果官方脚本版本更新了,参数可能略有变化,但总体结构不变。你也可以先运行python gen.py --help查看当前版本支持的参数,心里有数。

脚本跑起来后,终端会输出一长串 CMake 处理日志,包括检测编译器和依赖项、生成构建文件等。正常情况下它会自动在源码根目录下创建build/目录,构建脚本就在里面。

如果这一步出现“Could not find SKIA_DIR”之类的输出,多半是环境变量没设置或路径不对,回到 3.3 小节检查重来。生成完成后,终端最后几行通常会提示下一步操作命令,包括cmake --build怎么用,照着继续执行即可。

注意,这一步的输出不要一扫而过,建议把最后几行留在屏幕上,后面构建用得上。

4.3 手动构建目标与配置要点

gen.py执行完成后,build/目录里已经有了完整的构建文件,其中一个关键文件是build.ninja,这是 Ninja 直接读取的施工图。如果这一步做完,你就知道最终的目标名是aseprite,后面构建命令里要用到这个目标名。

有些版本会要求你额外指定一些编译选项,比如要不要带调试符号、要不要启用某些实验特性。Aseprite 官方构建配置里默认带优化和调试符号(RelWithDebInfo),既保证运行速度,又保留一定的定位能力,一般不需要改动。如果你只是想日常用,默认配置就是最优解。

5. 正式编译:一步步逼近 aseprite.exe

5.1 构建命令与执行节奏

配置完成后,执行构建命令。在源码根目录下运行:

cmake --build build --target aseprite

这一句是让 CMake 去build/目录里调用 Ninja,只构建aseprite这个目标。也可以直接进入build/目录运行ninja aseprite,效果一样,看个人偏好。

第一次构建的时候,CPU 会迅速吃满,风扇狂转,这是正常现象。Aseprite 的代码量加上依赖,编译产物成百上千个目标文件,走完这第一轮需要相当一段时间。这个过程中不用一直盯着屏幕,但留意有没有红色的ERROR字样就行。

如果中途报错,终端会停在出问题的那一行。修完之后重新运行同一个命令,Ninja 的增量机制会自动跳过已经编译成功的文件,速度比从头再跑快很多。

5.2 控制并发与资源占用的心法

Ninja 默认会根据 CPU 核心数决定并行编译任务的个数,一般情况下不用手动指定。但如果你电脑内存不大(比如 8GB),并发太高会导致内存耗尽,编译器被系统杀进程或者直接崩溃。

此时可以主动控制并发量,降低每个任务的内存峰值。进入build/目录后执行:

ninja aseprite -j 4

-j 4表示最多同时跑 4 个编译任务,内存压力小很多。等首次全量编译完成之后,后续增量编译并发调到再高都没问题,因为一次只改几个文件,内存占用很小。

还有一个小建议:编译期间把浏览器、聊天软件这些大户关一关,特别是 Windows 10 的 Defender 实时扫描会在编译时插一脚,动辄吃 CPU。把编译目录加入 Defender 排除列表能明显提升构建速度,这个后面还会再提。

5.3 输出位置与首次启动验证

漫长的等待结束后,你会得到一个可执行文件,默认位置是:

build\bin\aseprite.exe

Aseprite 的运行还需要同目录下的data/资源文件夹(保存着默认脚本、图标、语言资源、扩展模块等)。构建流程会把data/也一并生成或复制到build\bin\下,所以不要把 exe 单独拷出来放到空白目录里运行,要整个build\bin\目录一起使用,才能正常加载资源。

首次启动时,扔进去随便画几笔,检查画笔、图层、动画面板、保存导出这些基础功能是否正常。如果窗口能弹出、界面渲染没问题,说明 Skia 正确链接了,你的第一个自编译版 Aseprite 就成功了。

6. 高概率翻车现场与排查速查表

6.1 我实际遇到过的高频报错

把编译 Aseprite 过程中的典型陷阱按出现频率排个序,第一个就是“拉到源码后直接构建,然后报找不到laf/...头文件”。原因就是子模块没拉全,很多人只git clone了主仓库,根本没执行git submodule update。解决方法是回到 3.1 补上子模块操作,重新配置构建。

第二个高频问题是“执行 gen.py 时说找不到 Python”。有些人明明刚装了 Python,但安装时没有勾选加入 PATH,或者安装后没重新打开终端。环境变量这东西只在终端打开时读一次,不重开永远不生效。执行where python检查一下,没有就重启终端或重配 PATH。

第三个是“MSVC 编译器报语法错误”。如果你用的老版本 VS(比如 2015/2017),很可能编不过当前 main 分支的新代码。Aseprite 新版本要求较新的 C++ 标准,老老实实装 VS2022 是最稳妥的。

第四个是构建途中断言internal compiler error或内存不足。这种现象常见于内存 8GB 以下还满并发编译,按 5.2 的方法限一下并发,把其他程序关掉,问题基本能解决。

6.2 问题与解决速查表

把常见报错汇总成下面这个表,实际遇到的时候对着查一下:

现象可能原因处理方法
提示找不到cl.exe在普通终端里编译改用“x64 Native Tools Command Prompt for VS”
提示找不到 Python3Python 未加入 PATH安装时勾选 PATH,或手动添加环境变量并重启终端
提示找不到 NinjaNinja 未安装/PATH 未配置下载 ninja,加入 PATH,重启终端
找不到laf/相关头文件Git 子模块未拉全git submodule update --init --recursive
链接时报 Skia 相关错误Skia 版本与源码不匹配重新下载对应版本的预编译 Skia,更新SKIA_DIR
报错SKIA_DIR不存在环境变量路径错误或未生效确认路径正确,重开终端用echo %SKIA_DIR%验证
构建期间内存爆炸、进程被杀并发太高,物理内存不足用ninja -j 4限制并发,关闭大型软件
Defender 拖慢编译速度实时扫描占资源把工程目录加入 Defender 排除列表
编译中磁盘写满构建产物太大清理临时文件,预留至少 10GB 空间

6.3 两个容易忽略的系统级小坑

Windows 还有个“路径过长”的老毛病。你把工程放在C:\Users\Administrator\Desktop\...\...\这种层级特别深的地方,构建时往往走到某个文件就报系统找不到路径。解决方案有两个:一是把工程路径缩到短一点,比如直接放在D:\dev\aseprite;二是在组策略里开启“启用 Win32 长路径”支持。改注册表或组策略有一定门槛,所以我个人推荐把路径缩短,一劳永逸。

另一个是安全软件的误杀。编译出的 exe 是全新的、无签名的二进制文件,某些杀毒软件会把它当风险文件直接隔离。编译到一半发现 exe 生成后瞬间消失,或者启动时被杀毒弹窗拦截,基本都是这个原因。把build/目录加白名单就好,或者暂时关闭实时防护,编译完成后再恢复。

7. 编译完成后的进一步玩法

7.1 让程序真正长成你想要的样子

编译完成只是开始。Aseprite 的源码完全在自己手里,很多日常操作的默认行为都可以改。

比如你想改启动时的默认画布尺寸,直接去src/里搜索相关的默认参数,改数字重新编一个出来,启动就是你要的规格。想把某个快捷键换成更顺手的组合,也不需要在软件设置里处处调整,直接在源码里改掉默认映射,装到任何一台机器都是自己的习惯。

这种定制是官方二进制包给不了的乐趣。编译 Aseprite 的边际成本在第一次构建完成后急剧下降,因为增量编译一次往往只需要几分钟,改一点、编一点、跑一下验证,整个迭代过程非常顺畅。

7.2 跟踪最新版与增量编译技巧

Aseprite 官方迭代很快,功能更新频繁。保持自己编的版本不过期,核心流程就是四步:

git pull git submodule update --init --recursive python gen.py --vs vs2022 cmake --build build --target aseprite

注意执行完git pull之后,检查一下上游有没有更新 Skia 的需求。有时候你会发现新代码编不过,看一眼报错内容,多半是渲染部分连不上 Skia 的老接口,这时重新下载对应版本的 Skia 并更新SKIA_DIR就好了。

前面三步重跑很快,第四步如果是小改动,Ninja 只需要处理变动的文件,几分钟就能出新的 exe。养成编译前先看更新日志的习惯,比每次都闭着眼拉代码更靠谱。

7.3 分发编译版时需要注意的边界

自己编译出来的 exe 也不建议到处发放。在你自己的机器上用是完全没问题的,但如果你想拷给朋友或者发到网上分享给别人,就要留意一下软件许可证的约束了。Aseprite 的源码虽然公开,但分发二进制版本的行为边界是需要留意的。最简单稳妥的做法:只做个人使用,或者给熟悉的人演示,明确说明这是自行编译的版本。

另外一个分发小细节:把整个build\bin目录压缩拷贝过去,确保data/文件夹一并在内。我曾经只发了一个 exe,对方打不开,排查半天才发现是资源目录没带上。这些经验都是用时间换来的,谁试谁知道。

我自己在做过几次完整编译之后,现在基本把这套流程写成了一个脚本丢在工程目录旁边,每次更新源码跑一遍脚本,一条龙出包。一开始可能要对着文档一步步走,但当你把整套流程吃透,再回头审视最初那些报错,会发现每一步坑背后都有非常清晰的逻辑。安心按节奏走,你也能拿到属于自己的那份 aseprite.exe。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询