尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

在 Windows 上从源码构建 Ruby:Mingw/UCRT 与 Visual C++ 双路径完整指南

在 Windows 上从源码构建 Ruby:Mingw/UCRT 与 Visual C++ 双路径完整指南 在 Windows 上从源码构建 RubyMingw/UCRT 与 Visual C 双路径完整指南【免费下载链接】rubyThe Ruby Programming Language项目地址: https://gitcode.com/GitHub_Trending/ru/ruby本文以 Ruby 官方文档 doc/distribution/windows.md 为主线系统讲解在 Windows 平台从源码编译 Ruby 的两条官方推荐路径基于 RubyInstaller-Devkit 的 Mingw/UCRT 构建以及基于 Visual C 的 mswin 构建。你将掌握完整的构建环境准备、configure/nmake 参数含义、vcpkg 依赖管理以及图标嵌入等实操细节并可从仓库中的 win32/configure.bat、win32/vssetup.cmd、win32/Makefile.sub 等源码中印证每一步的底层原理。Windows 原生构建平台概览Ruby 在 Windows 上支持多种原生构建平台核心差异在于使用的 C 编译器和 C 运行时CRT平台编译器C 运行时说明mswinMicrosoft Visual CMSVCvcruntimeXXX.dll官方主要支持路径需配合 VS Build Tools 与 vcpkgmingw-msvcrtMinGW 编译器msvcrtXX.dll基于老式 MSVCRT 的 MinGW 构建mingw-ucrtMinGW 编译器Windows Universal CRTUCRT推荐使用的 MinGW 构建方式运行时兼容性更好其中mingw-ucrt对应 RubyInstaller-Devkit 的ucrt64环境是“最容易搭建的构建环境”而mswin路径则是需要严格依赖 MSVC 工具链的完整工程化构建方式。下文分别给出这两条路径的完整操作步骤。路径一使用 Mingw 与 UCRT 构建 Ruby官方文档明确推荐最容易的构建环境就是一套标准的 RubyInstaller-Devkit 安装 git-for-windows编辑器可选用 VSCode。整个流程只需要一条ridk命令激活 MSYS2 环境再用pacman补齐依赖最后走标准的autogen.sh→configure→make三步。环境准备安装 RubyInstaller-Devkit自带 MSYS2 环境与ridk工具安装 git-for-windows打开 Windows 命令行或 PowerShell依次执行ridk install ridk enable ucrt64ridk install用于确认/安装 MSYS2 开发工具链ridk enable ucrt64则将当前终端切换到ucrt64子环境后续pacman与构建命令都在该环境下运行。然后安装构建 Ruby 所需的三个核心 C 库OpenSSL加密与 TLS、libyamlYAML 解析Psych 依赖、libffiFFI 调用Fiddle 依赖。这三个库在 vcpkg.json 的 mswin 依赖清单中同样出现是 Ruby 扩展库的基础依赖。在 Windowscmd中构建ridk install ridk enable ucrt64 pacman -S --needed %MINGW_PACKAGE_PREFIX%-openssl %MINGW_PACKAGE_PREFIX%-libyaml %MINGW_PACKAGE_PREFIX%-libffi mkdir c:\work\ruby cd /d c:\work\ruby git clone https://github.com/ruby/ruby src sh ./src/autogen.sh mkdir build cd build sh ../src/configure -C --disable-install-doc make注意%MINGW_PACKAGE_PREFIX%是 MSYS2 预设的环境变量在ucrt64环境下其值为mingw-w64-ucrt-x86_64保证pacman安装的是 UCRT 版本而非 msvcrt 版本的工具链与库。autogen.sh负责根据 defs/ 下的模板如 defs/lex.c.src、defs/opt_insn_unif.def生成configure脚本等构建必需文件configure -C中的-C表示缓存 configure 测试结果以加速后续重新配置--disable-install-doc跳过 rdoc 文档的安装加快构建。在 MSYS2bash中构建与 cmd 版本等价但进入 MSYS2 的 bash 环境后无需sh前缀ridk install ridk enable ucrt64 bash pacman -S --needed $MINGW_PACKAGE_PREFIX-openssl $MINGW_PACKAGE_PREFIX-libyaml $MINGW_PACKAGE_PREFIX-libffi mkdir /c/work/ruby cd /c/work/ruby git clone https://github.com/ruby/ruby src ./src/autogen.sh cd build ../src/configure -C --disable-install-doc make注意 bash 中环境变量引用使用$MINGW_PACKAGE_PREFIX且路径写法为 MSYS2 风格/c/work/ruby即C:\work\ruby。使用其他 MSYS2 环境如 scoop 安装如果你通过scoop等其他包管理器安装了独立的 MSYS2 环境则$MINGW_PACKAGE_PREFIX必须显式指定为mingw-w64-ucrt-x86_64并额外给configure传入--with-opt-dir指明依赖库的安装位置sh ../../ruby/configure -C --disable-install-doc --with-opt-dirC:\Users\username\scoop\apps\msys2\current\ucrt64--with-opt-dir告诉 configure 去哪里查找可选的头文件include与库lib目录。这一参数同样用于 mswin 路径指向 vcpkg 的安装目录是贯穿两条构建路径的关键选项。路径二使用 Visual Cmswin构建 Rubymswin 路径使用微软官方 MSVC 工具链依赖管理统一交给 vcpkg是官方文档中篇幅最重的部分。前置要求操作系统Windows 10 / Windows Server 2016 或更高版本。编译器Visual C 14.0VS 2015或更高版本。若构建 x64 版本必须使用原生 x64 编译器不能用 x86 编译器交叉编译 x64。最低要求为VS 2017 / 2019 / 2022 版本的 VC/MSVC 构建工具Windows 10/11 SDK。可以使用winget安装 Visual Studio Build Tools仓库中提供了现成的批处理 win32/install-buildtools.cmd它会以--passive模式安装最小化组件集VC.Tools.x86.x64、VC.Redist.14.Latest、CoreBuildTools以及Windows11SDK.26100若宿主是 ARM64 还会追加VC.Tools.ARM64与VC.Tools.ARM64EC。环境变量必须正确设置INCLUDE、LIB、PATH以便命令行能找到编译链接所需的命令。这些变量通常由vsdevcmd.bat或vcvarall*.bat设置。仓库提供了封装脚本 win32/vssetup.cmd直接在命令行中运行即可原生构建默认架构cmd /k win32\vssetup.cmd交叉构建 arm64 二进制cmd /k win32\vssetup.cmd -archarm64交叉构建 x64 二进制cmd /k win32\vssetup.cmd -archx64从 win32/vssetup.cmd 源码可以看出该脚本通过vswhere.exe定位最新安装的 Visual Studio将-arch等参数原样透传给VsDevCmd.bat并把x86_64规范化为amd64cmd /k则保证环境变量在后续会话中持续生效win32\vssetup.cmd -help可查看全部命令行选项。构建 Ruby 至少需要以下命令nmake、cl、ml、lib、dumpbin。从 GIT 源码构建时的额外要求需要git与 Ruby 3.1 或更高版本作为 base ruby 参与构建。可用scoop一键安装scoop install git ruby注意 Windows 版 git 的autocrlf默认是true会导致 Ruby 测试套件失败请显式关闭git config --global core.autocrlf falsevcpkg 安装依赖库在 ruby 仓库目录下执行vcpkg --triplet x64-windows installmswin 平台所需的依赖在 vcpkg.json 中声明gmp、libffi、libyaml、openssl、zlib并固定了builtin-baseline版本。启用命令扩展cmd.exe默认即启用如需显式开启用/E:ON运行cmd.exe。开启开发者模式nmake check中的部分测试会创建符号链接symbolic link需在“设置 系统 开发者选项”中开启 开发者模式否则会因Permission denied rb_file_s_symlink失败。编译与安装步骤在构建目录执行win32\configure.bat生成 Makefile。可用参数包括--targetTARGET指定目标平台例如--targeti686-mswin32默认值即i386-mswin32见 win32/configure.bat 的--help输出--prefixinstall_directory指定安装目录默认是/usr--srcdirDIR指定源码目录默认取 configure 目录或其上级--with-opt-dirDIR-LIST以;分隔的额外头文件/库搜索目录列表。自定义可执行文件与 DLL 文件名--program-prefix/--program-suffix给可执行文件名追加前后缀如win32\configure.bat --program-suffix-$(MAJOR)$(MINOR)可生成带版本号的可执行文件--install-name/--so-name分别精确指定可执行文件与 DLL 的基础名如win32\configure.bat --install-name$(RUBY_BASE_NAME)-$(MAJOR)$(MINOR)。从 win32/Makefile.sub 可以看出这些变量的生成规则RUBY_INSTALL_NAME $(PROGRAM_PREFIX)$(RUBY_BASE_NAME)$(PROGRAM_SUFFIX)而 DLL 名为RUBY_SO_NAME $(RT)-$(RUBY_BASE_NAME)$(MAJOR)$(MINOR)0如x64-msvcrt-ruby330。默认情况下无控制台窗口的可执行文件rubyw名由RUBY_INSTALL_NAME把ruby替换为rubyw得到如需进一步定制可直接在生成的 Makefile 中修改RUBYW_INSTALL_NAME。指定 vcpkg 目录win32\configure.bat --with-opt-dirC:/vcpkg_installed/x64-windows从 GIT 源码构建时先运行nmake up更新版本信息等生成文件。运行nmake编译。如需要将 vcpkg 安装的 DLL如libssl-3-x64.dll复制到构建目录以管理员权限运行nmake prepare-vcpkg。运行nmake check执行测试。运行nmake install安装。configure.bat还支持若干实用选项见其内置--help--with-baserubyRUBY指定 base ruby 路径、--with-static-linked-ext静态链接扩展、--with-ext/--without-ext控制启用的扩展、--with-ntver指定目标 NT 版本宏_WIN32_WINNT_XXXX、--disable-install-doc跳过 rdoc 安装等。构建示例① 在源码目录内直接构建ruby source directory: C:\ruby build directory: C:\ruby install directory: C:\usr\localC: cd \ruby win32\configure --prefix/usr/local nmake nmake check nmake install② 在源码目录的相对子目录中构建分离构建目录ruby source directory: C:\ruby build directory: C:\ruby\mswin32 install directory: C:\usr\localC: cd \ruby mkdir mswin32 cd mswin32 ..\win32\configure --prefix/usr/local nmake nmake check nmake install③ 构建目录与源码目录不在同一驱动器ruby source directory: C:\src\ruby build directory: D:\build\ruby install directory: C:\usr\localD: cd D:\build\ruby C:\src\ruby\win32\configure --prefix/usr/local nmake nmake check nmake install DESTDIRC:注意跨驱动器构建时必须用绝对路径调用 configure并通过nmake install DESTDIRC:指定安装目标盘符。④ 构建 x64 版本需要原生 x64 VC 编译器ruby source directory: C:\ruby build directory: C:\ruby install directory: C:\usr\localC: cd \ruby win32\configure --prefix/usr/local --targetx64-mswin64 nmake nmake check nmake install已知限制Bugs源码目录路径不能包含任何空白字符这源于NMAKE的!INCLUDE指令行为可在任意目录含源码目录构建唯独不能是源码目录下的win32目录这是NMAKE路径搜索方式带来的限制。这一点在 win32/configure.bat 中也有呼应——脚本开头的main逻辑会检测当前目录是否为win32目录并直接报错退出。vcpkg 依赖管理mswin 平台统一使用 vcpkg 管理第三方依赖gmp、libffi、libyaml、openssl、zlib声明于 vcpkg.json。除手动执行vcpkg --triplet x64-windows install外构建系统提供了两个便捷目标定义于 win32/Makefile.subnmake update-vcpkg # 更新 vcpkg 的 baseline 版本对应 vcpkg x-update-baseline nmake install-vcpkg # 从构建目录安装 vcpkg 依赖对应 vcpkg installnmake prepare-vcpkg则负责把vcpkg_installed\VCPKG_DEFAULT_TRIPLET\bin下的运行时 DLL如 OpenSSL 的libssl-3-x64.dll复制到构建目录确保最终可执行文件能直接运行。图标Icons嵌入规则构建目录下、icondirs变量指定的目录中以及源码win32目录下的任意*.ico文件会按基础名规则自动嵌入到 DLL 或可执行文件实现见 win32/Makefile.sub 中RCFILES与资源编译相关规则$(RUBY_INSTALL_NAME).ico 或 ruby.ico -- $(RUBY_INSTALL_NAME).exe $(RUBYW_INSTALL_NAME).ico 或 rubyw.ico -- $(RUBYW_INSTALL_NAME).exe 其余 .ico 文件 -- $(RUBY_SO_NAME).dllRuby 源码本身不附带图标你可以使用任意自己喜欢的图标文件例如基于 Ruby logo kit 制作的图标只需按上述命名规则放入构建目录即可自动生效。小结个人开发者快速体验/开发 Ruby 本体优先走 Mingw/UCRT 路径RubyInstaller-Devkit ridk enable ucrt64pacman装依赖 autogen.sh/configure/make三步即可完成成本最低官方级/发行版级构建走 mswin 路径用win32\vssetup.cmd准备 MSVC 环境、win32\configure.bat定制目标与安装参数、vcpkg 管理依赖、nmake系列目标完成编译、测试与安装无论哪条路径--with-opt-dir都是定位第三方依赖目录的关键参数而路径中不要出现空格、避免在win32目录内构建则是两个需要牢记的硬性约束。仓库中 win32/configure.bat、win32/vssetup.cmd、win32/install-buildtools.cmd、win32/Makefile.sub 与 vcpkg.json 是理解上述全部行为的第一手源码配合本文的步骤即可在 Windows 上顺利编译出属于你自己的 Ruby。【免费下载链接】rubyThe Ruby Programming Language项目地址: https://gitcode.com/GitHub_Trending/ru/ruby创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表