Open Watcom
Open Watcom 是一个 Fortran/C/C++ 编译器,具有许多交叉编译目标。那些年纪较大的人很可能深情地记得以 DOS4GW 扩展器结尾的旧 DOS 游戏,其中 "W" 代表 "watcom"。总的来说,它在当时是一个 非常流行的高端游戏编译器,用于在内存受限的环境(如 DOS)中生成非常高效的二进制文件。Watcom 仍在发展[死链 2023-05-06 ⓘ] 作为 Open Watcom,版本 1.9 有一个 官方发布版,版本 2.0 有一个 非官方分支。
安装
非官方 2.0 版本可以使用 openwatcom-v2AUR 软件包安装。
Wmake
Open Watcom 自带 make 实用程序 (wmake)。在 Windows 和 Linux 主机上,CMake 支持生成 wmake 文件。将 OW 工具与 CMake 一起使用 描述了如何在 Linux 或 Windows 上使用 CMake 为交叉编译生成 wmake 文件。
在 Wine 中使用 Open Watcom 软件包
openwatcom-v2AUR 软件包默认包含所有受支持主机平台的执行文件。如果有人例如想使用 watcom 调试器 wd 调试交叉编译的二进制文件,这有时会非常方便。原则上,使用 DOS 模拟器也可以做到这一点。设置 WINEPREFIX 以使用已存在的 Watcom 安装的步骤
- 通过 WINEPREFIX=$HOME/.watcom winecfg 创建一个新的 WINEPREFIX(例如 $HOME/.watcom)
- cd 到 $WINEPREFIX/drive_c 并创建一个指向 /opt/watcom 的名为 watcom 的符号链接 (ln -s /opt/watcom watcom)
- 运行 regedit
- 在 HKEY_CURRENT_USER/Environment 下,添加以下字符串变量
- WATCOM = C:\WATCOM
- PATH = C:\WATCOM\BINNT
- EDPATH = C:\WATCOM\EDDAT
- WIPFC = C:\WATCOM\WIPFC
编译器
Open Watcom 配备了一个非常高效的原生 16 位编译器,支持 DOS 和 Win16 目标,以及一个 32 位 x86 编译器,目标是许多不同的操作系统(NT/Win32、OS/2、NetWare、Linux,...)。它还对 PowerPC、Alpha AXP、MIPS 和 SPARC 架构提供实验性支持。v2 开发的 主要目标[死链 2023-05-06 ⓘ] 是支持 x86_64 和 ARM 架构。Open Watcom 最明显的“竞争对手”将是基于 GCC 的 MinGW(用于 Win32 目标)和 DJGPP(用于 DOS 目标)。
16 位 x86 编译器
16 位 x86 编译器在其 $WATCOM/lib286 目录中查找与其操作系统无关的库,并在 $WATCOM/lib286/${target_os} 子目录中查找与其操作系统相关的库。某些操作系统可能需要额外的库路径,可以通过 LIBPATH 环境变量添加。
- wcc:16 位“仅编译”C 编译器
- wpp:16 位“仅编译”C++ 编译器
- wcl:16 位 C/C++“编译和链接”实用程序
- wfc:16 位“仅编译”Fortran 编译器
- wfl:16 位 Fortran“编译和链接”实用程序
- owcc:POSIX 兼容的“编译和链接”实用程序。在依赖于 GNU makefile 的项目中设置 CC=owcc。
32 位 x86 编译器
32 位 x86 编译器在其 $WATCOM/lib386 目录中查找与其操作系统无关的库,并在 $WATCOM/lib386/${target_os} 子目录中查找与其操作系统相关的库。某些操作系统可能需要额外的库路径,可以通过 LIBPATH 环境变量添加。
- wcc386:32 位“仅编译”C 编译器
- wpp386:32 位“仅编译”C++ 编译器
- wcl386:32 位 C/C++“编译和链接”实用程序
- wfc386:32 位“仅编译”Fortran 编译器
- wfl386:32 位 Fortran“编译和链接”实用程序
- owcc :POSIX 兼容的“编译和链接”实用程序。在依赖于 GNU makefile 的项目中设置 CC=owcc。
与其他(交叉)编译器的比较
与基于 binutils 的编译器(gcc,clang,pccAUR)在用作交叉编译器时相比,一个显着的区别是 Open Watcom 仅使用单个编译器(每个目标 CPU 架构一个),而目标操作系统由编译标志确定(请参阅下面的“交叉编译”)。此外,许多与操作系统无关的库位于通用的特定于架构的位置($WATCOM/lib286 和 $WATCOM/lib386),只有具有特定于操作系统功能的库才被放入特定于操作系统的子目录中 - 这要归功于与编译器一起分发的 Open Watcom C 运行时。这意味着非常容易使用单个 Open Watcom 安装作为各种操作系统的交叉编译器。相比之下,基于 binutils 的交叉编译工具链通常需要构建目标特定的 binutils、编译器和 libc 的“三位一体”。Open Watcom 作为 Win32 交叉编译器的另一个优点是,生成的二进制文件和库与目标操作系统很好地集成。例如,用 Open Watcom 编译的 Python[死链 2023-06-17 ⓘ] 可以加载用 MSVC 编译的插件。这类似于不同的基于 binutils 的编译器(通常)如何使用用另一个基于 binutils 的编译器构建的库。目前,生成的二进制文件不如 GCC 生成的二进制文件优化。
编译器优化标志和其他选项
Watcom 编译器的标志不遵循与 GCC 相同的标准(例如,默认情况下它不会理解 -O3)。它具有 丰富的选项集,用于定义目标架构、优化和其他内容。可以在 此处[死链 2023-05-06 ⓘ] 找到一些推荐的用于优化 16 位代码的标志。
(交叉)编译:常用设置
要进行交叉编译,请设置正确的环境变量和一个编译标志,告诉编译器预期的目标。如果没有定义目标的编译标志,则假定为本机构建。
所有目标的通用设置(来自 Arch Linux 主机)
export WATCOM=/opt/watcom
export PATH=$WATCOM/binl:$PATH
export EDPATH=$WATCOM/eddat
export WIPFC=$WATCOM/wipfc
可以在 此处 找到所有构建目标的小概览。
Linux
对于 C,使用编译器:wcc386、wcl386 或 owcc,为 wcc386 添加 -bt=linux,为 wcl386 添加 -bcl=linux,或为 owcc 添加 -blinux。如果未添加其他内容,则编译器假定为本机构建,因此标志不是绝对必要的。
export INCLUDE=$WATCOM/lh
DOS (16 位)
为 wcc 添加 -bt=dos,为 wcl 添加 -bcl=dos,或为 owcc 添加 -bdos
export INCLUDE=$WATCOM/h
DOS (32 位 DOS4GW 扩展器)
为 wcc386 添加 -bt=dos,为 wcl386 添加 -bt=dos -l=dos4g,或为 owcc 添加 -bdos4g
export INCLUDE=$WATCOM/h
WIN16
为 wcc 添加 -bt=windows,为 wcl 添加 -bcl=windows,或为 owcc 添加 -bwindows
export INCLUDE=$WATCOM/h:$WATCOM/h/win
WIN32
为 wcc386 添加 -bt=nt,为 wcl386 添加 -bcl=nt,或为 owcc 添加 -bnt
export INCLUDE=$WATCOM/h:$WATCOM/h/nt
OS/2 (16 位)
为 wcc 添加 -bt=os2,为 wcl 添加 -bcl=os2,或为 owcc 添加 -bos2
export INCLUDE=$WATCOM/h:$WATCOM/h/os21x
export LIBPATH=$WATCOM/binp/dll:$LIBPATH
OS/2 (32 位)
为 wcc386 添加 -bt=os2,为 wcl386 添加 -bt=os2 -l=os2v2,或为 owcc 添加 -bos2v2
export INCLUDE=$WATCOM/h:$WATCOM/h/os2
export LIBPATH=$WATCOM/binp/dll:$LIBPATH
Netware
为 wcc386 添加 -bt=netware,为 wcl386 添加 -bcl=netware,或为 owcc 添加 -bnetware
export INCLUDE=$WATCOM/h:$WATCOM/novh
export LIBPATH=$WATCOM/nlm:$LIBPATH
某些软件包可能需要 来自 Novell 的专有库和头文件集,可以从 Micro Focus 网站下载
QNX
Watcom 编译器还支持 QNX 作为目标,但由于库未与开源 Open Watcom 发行版一起重新分发,因此自那时以来一直没有经过充分测试。从理论上讲,如果为 Watcom 构建了 C 库,则仍然可以为 QNX 进行编译
打包的第三方库和实用程序
有许多 可用于 Watcom 的第三方库和资源[死链 2023-05-06 ⓘ]。打包应符合 MinGW 打包指南,但不同之处在于它们尽可能地打包为拆分软件包。拆分软件包目标的一个例外是当一个目标具有唯一的(或专有的)构建依赖项时。预打包的库和编译器前端旨在使人们可以轻松开始使用交叉编译器。以下是为 Arch linux 打包的一些资源
额外的语言
GCC 比 Open Watcom 强大的一个领域是语言支持。为了缓解这个问题,一些 源到源编译器 可以在 Watcom 上/为 Watcom 构建。
参见
Open Watcom 社区相对较小,在 Reddit 上的活跃度适中。主要的讨论在 Open Watcom 新闻组 上的“contributors”和“users.c_cpp”组中进行,第三种选择是 sourceforge 上的用户论坛。
要获得持续更新的信息,请查看 Github 上的 Open Watcom v2 wiki。