skeeto/w64devkit

GitHub: skeeto/w64devkit

这是一个便携式 C/C++ 开发套件,专为 Windows 设计,无需安装即可离线编译和调试程序。

Stars: 4532 | Forks: 346

# 适用于 x64 与 x86 Windows 的可移植 C、C++ 和 Fortran 开发套件 [w64devkit][] 是一个 Dockerfile,它从源代码构建一个小型、可移植的开发套件,用于在 x86 和 x64 Windows 上创建 C 和 C++ 应用程序。预编译好的即用套件请查看“Releases”部分。 包含的工具: * [Mingw-w64 GCC][w64]:编译器、链接器、汇编器 * [GDB][gdb]:调试器 * [GNU Make][make]:标准构建工具 * [CMake][cmake] 与 [Ninja][ninja] 和 [调试器][dcmake]:构建系统 * [busybox-w32][bb]:标准 Unix 工具,包括 sh * [Vim][vim]:强大的文本编辑器 * [Universal Ctags][ctags]:源码导航 * [Ccache][ccache]:编译器缓存 * [NSIS][nsis]:Windows 安装程序编译器(`makensis`) * [aas-sign][aas-sign]:通过 Azure 可信签名进行 Authenticode 签名 这是一个 MSVCRT 工具链,支持 pthreads、C++11 线程和 OpenMP。所有包含的运行时组件均为静态链接。**使用开发套件无需 Docker**。Docker 只是用于构建套件本身的可靠、纯净环境。 ### 通过 GitHub Actions 构建 GitHub 可以帮你构建 w64devkit。Fork 该仓库,启用 GitHub Actions,推送你的提交,然后下载新构建好的构件。 ## 使用方法 或者,将 `w64devkit/bin` 目录添加到你的 PATH 环境变量中。例如,在 `cmd.exe` 控制台或批处理脚本中: ``` set PATH=c:\path\to\w64devkit\bin;%PATH% ``` 然后启动一个交互式 Unix shell: ``` sh -l ``` ## 主要特性 * 无需安装。可以任何用户身份在任何位置运行。不再需要时直接删除即可。 * 完全离线。无需互联网访问,也不会尝试连接。 * 专注于静态链接所有运行时组件。 * 从源代码构建非常简单,这意味着你可以轻松地根据自身需求调整和修改套件的任何部分。 ## 操作系统支持 x64 套件需要 Windows 7 或更高版本,但某些工具仅在 Windows 10 或更高版本上支持 Unicode(“宽字符”)路径、输入和输出。该工具链默认目标是 Windows 7。 x86 套件需要 Windows XP 或更高版本以及支持 SSE2 的处理器(例如至少 Pentium 4);Unicode 支持有限。该工具链默认目标相同。运行时包含 SSE2 指令,因此在链接运行时库时,GCC 的 `-march` 参数无法可靠地针对性能较弱的处理器(例外:`-lmemory`、`-lchkstk`)。CMake、Ninja 和 CCache 至少需要 Windows 7。 ## 构建缓存 将 `$W64DEVKIT_HOME/lib/ccache` 添加到你的 `PATH` 路径最前面,将透明且自动地通过 Ccache 缓存所有构建。 ``` PATH="$W64DEVKIT_HOME/lib/ccache;$PATH" ``` 或者直接使用 `ccache`、`ccache-gcc` 或 `ccache-g++`。你可以通过 `w64devkit.ini` 激活建议的 Ccache 配置。 ## 特殊链接注意事项 w64devkit 独有的特性,`libmemory.a` 是一个由 x86 字符串指令实现的 `memset`、`memcpy`、`memmove`、`memcmp` 和 `strlen` 的库。当[未链接 CRT][crt] 时,链接 `-lmemory` 可以提供极小的定义,特别是在 GCC 需要它们时。 同样为 w64devkit 独有,`libchkstk.a` 包含一个比 GCC(`-lgcc`)更精简、更快的 `___chkstk_ms` 定义,以及有时在链接 MSVC 构件时需要的 `__chkstk`。两者均属于公共领域,因此与默认实现不同,不涉及复杂的许可问题。当在 `-nostdlib` 构建中需要时,请链接 `-lchkstk`。 与传统工具链不同,导入表不会填充无意义的序号提示。如果未提供显式提示(即通过 DEF 文件),则提示将被置零:“无数据”。消除这些随机数据使二进制文件更具可压缩性,并且*理论上*加载更快。另见:`peports`。 ## C11 线程运行时 该工具链包含 C 标准头文件 `threads.h`,运行时包含一个快速、精简的标准线程实现。它独立于 pthreads,不需要额外的链接器标志。它仅支持 Vista 及更高版本,不支持递归锁或定时锁,并且与 MSVC 类似,`thrd_current` 返回一个仅对 `thrd_equal` 有用的虚拟句柄。使用此句柄进行 join 或 detach 操作将导致陷阱。同样与 MSVC 类似,`mtx_t` 和 `cnd_t` 支持零初始化,且其析构函数为空操作。 ## 推荐的可下载离线文档 除少数例外(例如 Vim 内置文档(`:help`)),w64devkit 不包含文档。然而,你无需在拥有离线开发工具的同时放弃离线文档。以下是一份推荐的、免费、可下载的文档列表,作为 w64devkit 功能的补充。大致按重要性排序: * [cppreference][doc-cpp] (HTML),针对 C 和 C++ 标准库的友好文档。 * [GCC 手册][doc-gcc] (PDF, HTML),用于参考 GCC 特性,特别是内置函数、内建函数和命令行开关。 * [Win32 帮助文件][doc-win32] (CHM) 较旧,但属于官方 Windows API 文档。遗憾的是很多内容缺失,如 Winsock。(离线 Windows 文档一直很难获得。) * [C 标准][doc-std-c] 和 [C++ 标准][doc-std-cpp](草案),用于了解边界情况的设计意图。 * [Intel Intrinsics 指南][doc-intr] (交互式 HTML),使用 SIMD 内建函数时的绝佳资源。(在左侧搜索“Download”。) * [GNU Make 手册][doc-make] (PDF, HTML) * [GNU Binutils 手册][doc-ld] (PDF, HTML),特别是 `ld` 和 `as`。 * [GDB 手册][doc-gdb] (PDF) * [BusyBox 手册页][doc-bb] (TXT),不过 w64devkit 内的所有内容也可以通过 `-h` 选项查看。 * [Intel 软件开发者手册][doc-intel] (PDF),用于参考 x86 指令,无论是在用 `objdump` 研究编译器输出时,还是在编写汇编代码时。 ## 库安装 除了标准库和 Win32 导入库之外,w64devkit 不包含其他库,但你可以安装额外的库,以便工具链能够自然地找到它们。有三种选项: 1. w64devkit 安装目录本身就是一个 sysroot(包含 `lib/`、`include/` 等),因此你可以像在 Unix 环境中一样,直接将库安装到 w64devkit 中。这是最简单的选项,但在每次 w64devkit 升级后需要重新安装。如果库定义了 `.pc` 文件,`pkg-config` 命令将自动找到并使用它们。 2. 将库的安装目录追加到你的 `CPATH` 和 `LIBRARY_PATH` 环境变量中。使用 `;` 分隔目录。你可能会在 `.profile` 文件中进行此设置。 3. 如果存在其 `pkgconfig` 目录,将其追加到 `PKG_CONFIG_PATH` 环境变量中,然后照常使用 `pkg-config` 命令。使用 `;` 分隔目录。 选项 (1) 和 (3) 的设计都能在 w64devkit 或库路径包含空格时正常工作。 ## 独特的命令行程序 * `peports`:显示 EXE 和 DLL 的导出表和导入表。类似 MSVC `dumpbin` 的 `/exports` 和 `/imports` 选项;比 Binutils 的 `objdump -p` 更窄、更精确。用于检查导出和导入是否符合预期。可与 `c++filt` 和 `vc++filt` 互补,例如在管道中使用。发音类似 *purports*。 * `vc++filt`:用于 [Visual C++ 名称修饰][names] 的 `c++filt`。用于检查与 GCC 不兼容的二进制文件,可能以便对其加以利用。 * [`debugbreak`][debugbreak]:使所有被调试进程在调试器中中断,如同使用 Windows 的 F12 调试器热键。对控制台子系统的程序特别有用。 ## 注意事项 `$HOME` 可以通过相邻的 `w64devkit.ini` 配置文件设置,并且甚至可以相对于 `w64devkit/` 目录。这有助于将整个开发环境(包括主目录)封装在可移动、甚至只读的存储介质上。在主目录中使用 `.profile` 文件可进一步配置环境。 地址消毒器(ASan)和线程消毒器(TSan)[尚未移植到 Mingw-w64][san]([另见][san2]),但未定义行为消毒器(UBSan)在 GDB 下运行良好。同时使用 `-fsanitize=undefined` 和 `-fsanitize-trap` 时,GDB 将[精确地在未定义行为处中断][break],并且不需要链接 libsanitizer。 ## 许可证 分发使用 w64devkit 构建的二进制文件时,你的 .exe 文件将包含此发行版的部分内容。对于 GCC 运行时(包括 OpenMP),你受 [GCC 运行时库例外条款][gpl] 保护,因此无需做任何事情。然而,Mingw-w64 运行时[存在常见的软件许可问题][bs],你可能需要根据你的程序使用的功能遵守各种 BSD 风格的许可证:[MinGW-w64 运行时许可][lic1] 和 [winpthreads 许可][lic2]。为简化此过程,w64devkit 在文件 `COPYING.MinGW-w64-runtime.txt` 中包含了所有许可证的合并集,该文件应随你的二进制文件一起分发。 ## 另请参见 * [LLVM MinGW][llvm-mingw]:类似的目标,但基于 LLVM。
标签:Authenticode签名, Bash脚本, Ccache, CMake, Ctags, C++语言, Docker构建, Fortran语言, GCC, GDB, GitHub Actions, Make, MinGW, Ninja, NSIS, SOC Prime, Vim, Windows开发, x64 Windows, x86 Windows, 二进制发布, 代码签名, 代码编辑器, 便携式软件, 免安装软件, 安装程序制作, 安装程序编译器, 工具链, 开发工具, 开源工具, 文本编辑器, 构建系统, 源代码导航, 离线工具, 离线开发, 编程环境, 编程语言, 编译器, 编译器缓存, 自动笔记, 轻量级工具, 静态链接