Windows 编程/使用 OSS 工具进行 Windows 编程
使用高速互联网连接,gcc——一个可以编译 C、C++ 和 Fortran 以及其他语言并在 Windows 上运行的免费编译器——可以通过 Cygwin 获得。安装 Cygwin 时,选择安装 “devel/gcc” 包,并根据计划编写的程序类型选择是否安装 “graphics/opengl”。 GCC 编译器集合的另一个 Windows 移植版本是 MinGW (Minimalist GNU for Windows),大约 10MB 的下载大小,是 Cygwin 大小的 1/10。 您也可以下载 DJGPP,但它更适合于 32 位控制台程序。 除了通过移植获得 gcc 编译器之外,还可以通过在 虚拟化 的 Linux 版本中从命令行编译,不仅包含 gcc,而且其内核“...是用 GCC 支持的 C 编程语言版本编写的...”
要进行编译,请打开命令行界面并使用以下命令
c:\cygwin\bin\gcc -s -Os -mno-cygwin -o <outputfilename> <inputfilename>
用于命令行程序,以及
c:\cygwin\bin\gcc -s -Os -mwindows -mno-cygwin -o <outputfilename> <inputfilename> -lopengl32 -lwinmm
用于 GUI 程序。
命令行标志说明
- -s:通过剥离调试崩溃应用程序的有用信息来使输出程序更小
- -Os:针对大小进行优化(-O3 用于执行速度)
- -mno-cygwin:使程序无需任何外部非标准 .dll 文件即可运行
- -mwindows:将其变成 GUI 应用程序
- -lopengl32:可选择使用 OpenGL 进行图形处理
- lwinmm:可选择添加一些多媒体支持,例如声音、操纵杆和高分辨率计时器
为了使用 Cygwin 编译,必须在 Cygwin 的 bin 目录中有一个编译器,而在 Linux 中,gcc 已经别名为可以在所有目录中使用。
对于更友好的环境,例如 Visual Studio,Bloodshed 的 Dev-C++ 是一个出色的 Windows 开源 IDE。 它拥有一个组织良好的图形用户界面,并包含设置 Windows C/C++ 开发环境所需的一切,默认情况下安装和使用 GCC 的 Mingw 移植版本(尽管可以将其配置为与其他基于 GCC 的编译器(如 Cygwin)配合使用)。 它的源代码(用 Delphi 编写)可以从 Bloodshed 网站获得,预编译的二进制文件也可以从该网站获得。 不过,Dev-C++ 已经很久没有更新了,并且 Code::Blocks 或 CodeLite 等替代方案已经出现。 Netbeans 是 Sun Microsystems 开发的作为 Java 官方 IDE 的 IDE,但 Netbeans 现在支持多种语言,并且可以通过其插件系统进行扩展。 另一个开源 IDE 是 Eclipse,它最初由 IBM 开发。 另一个专门为 C++ 创建的 IDE 是 Ultimate++。
这些是三种众所周知的 FOSS 开发工具集,用于编译应用程序,尽管它们的功能与 Microsoft 和 Borland 的 Windows 编程工具略有不同。
GCC 代表 GNU 编译器集合。 尽管它提供了对编译多种编程语言源代码的支持,但它最常用于 C 和 C++ 代码。 因为它是一个编译器而不是一个 IDE,因此像 DJGPP 这样的方法会将一些更深奥的细节隐藏在用户面前,简化了程序的创建,并提供了其他功能,如下所述。
DJGPP 是 DJ Delorie 自 1989 年以来开发的集成开发环境 (IDE)。 它是一个具有 32 位感知能力的 DOS 应用程序,并允许创建具有 DPMI 支持的软件。 作为 GCC 和其他 GNU 工具的组合移植版本,它通常用于编写、编译和调试控制台应用程序。 它可以利用 Allegro 等库来创建具有图形的应用程序,其他附加组件可以扩展其功能。 它支持跨平台开发,这意味着您可以在不需要实际的特定目标机器类型或操作系统实例的情况下创建软件,以便构建要运送到该配置的可执行文件。
MinGW 代表 Minimalist GNU for Windows,它包含使用 Win32 API 所需的头文件;它支持创建本机 Windows 可执行文件。 截至 2006 年 12 月下旬,维基百科将 MinGW 的目标定义为“仅提供免费编译器和工具链,优先考虑性能”。 这与 Cygwin 创建 POSIX 兼容开发环境的目标形成对比。 与 DJGPP 一样,它可用于跨平台开发。 由于 MinGW 可用于 Windows 之外的其他系统(如 Linux),即使没有 Windows 副本的开发人员也可以创建 Win32 API 应用程序。 此外,可以使用 WINE 程序(它将 Windows API 调用转换为相应的 UNIX 系统函数)来运行 PE 可执行文件(.exe 文件),以便了解应用程序的外观——而无需实际安装 Windows。
原始的 MinGW 项目(来自 mingw.org)已被分叉,现在有一个 MinGW64 项目。 原始项目仅提供 32 位编译器。 分叉的项目提供了 32 位和 64 位编译器。 项目的目标不同。 原始的 MinGW 项目努力仅与公开记录的 Windows API 配合使用。 MinGW64 项目声称他们使用干净室技术对缺少的信息进行了逆向工程,因此使用这些 API 不会侵犯版权。
Dev-C++ 是一个免费的图形化 IDE,它与 MinGW 一起打包,也可以使用 Cygwin 编译器。
LLVM 是一个开源的替代编译器。其目标之一是改进程序优化。它可以与其他编译器套件一起使用,例如微软的 C/C++ 编译器或 MinGW64。截至撰写本文时,它需要单独的链接器(例如 GNU 编译器套件通过 MinGW64 提供的链接器)。
如果你只想在 Linux 机器上使用 gcc 进行 Windows 开发(交叉编译到 Windows),另一个选择是 midipix 项目。它使用轻量级的 musl C 库以及 gnu 编译器套件。他们正在创建 POSIX 兼容层,以使用 ntdll 将 musl 移植到 Windows。这避免了需要 Windows C 运行时库(MinGW 需要它)。该项目已经移植了几个开源应用程序,并使用它们的 GNU gcc 编译器版本运行。
GCC、DJGPP 和 MinGW 不支持 Windows 编程中常见的图形化资源和 GUI 编辑。
MinGW 提供 w32api 包,其中包含支持本地 WIN32 API 的头文件和链接到 DLL 的方法。Windows OpenGL 和 DirectX 也可以与 MinGW 一起使用。MinGW 版本的 DirectX 头文件不如官方 Microsoft 头文件完整。
但是,开源库(如 QT、GTK+、wxWidgets 和 FLTK)提供了用户界面前端以及简化的模型,包装了 Windows API 的复杂性。最小的权衡是,这些可能需要特殊的许可证以及运行时 DLL 的捆绑。
你也可以使用 SDL、Allegro、SFML 等图形库来创建用户界面或绘制图形。
基于控制台的文本用户界面库,如 PDCurses 和 ncurses,也适用于 Windows。PDCurses 的一个端口具有 SDL 后端,允许开发人员将图形与文本用户界面集成。Nano-X 可以在 Windows 上使用 Allegro 或 SDL 后端构建,并且可用于构建一些与 X Windows 兼容的应用程序。
上面提到的所有 GUI 和图形库都适用于 MinGW。PDCurses、Nano-X、FLTK 和 Allegro 的版本适用于 DJGPP。
Cygwin 是为 Windows 创建的一个环境,模拟了 Unix 行为。它可以从 cygwin.com 获得,通过一个小的 setup.exe 包,运行时,它会询问要获取的功能选择。建议使用快速互联网连接,因为 Cygwin 包含许多非平凡的 shell、程序,甚至 GUI。
安装程序允许用户下载以下部分,以及其他部分
- Bash shell
- 开发工具,包括调试器、gcc 编译器支持的几种语言,以及 AWK、SED、YACC 和 Bison 支持
- 网络工具,如 ssh、lynx 浏览器、nmap 等
- 程序员文本编辑器,如 GNU Emacs、nano 和 vi
- X,这是一个非常难以在 Windows 上免费获取的环境(除非从源代码构建)
选择软件后,会将其下载并安装到用户硬盘根目录下的文件夹。它不会重新分区驱动器,也不需要安装任何 Unix 系统,也不使用磁盘映像。文件只是简单地安装在 cygwin 文件夹内的 Unix 层次结构中。
要运行 Cygwin,用户将在“开始”菜单程序或桌面快捷方式中找到一个名为 Cygwin Bash Shell 的程序。打开它后,会打开一个类似 DOS 的窗口,并显示一个经典的 bash 提示符。它与 DOS 不一样,它是彩色编码的,并且可以与 DOS 交互,因为它知道路径设置和其他系统变量,所以请注意,你的 Windows 应用程序可能位于你的系统路径变量中,并且会与文件夹的当前文件名冲突,因为 DOS 隐式地扩展了 EXE 扩展名。
作为额外说明,如果你需要访问计算机中的不同驱动器,而不是使用 /mnt/,你需要 cd 到 /cygdrive/ 中才能看到列出的驱动器。然后,查看 C: 驱动器的根目录,只需要在命令行中键入 cd /cygdrive/c 即可。
使用 Emacs 时,默认情况下,退出程序的正常组合键不起作用,虽然熟练的用户可能会找到一个 Emacs 键绑定技巧来解决这个问题。因此,当你想要从命令行模式退出编辑器时,你可能会感到厌烦,并挂起程序,以便在命令行中稍后杀死该进程。而不是按下 C-x C-c 来退出 emacs,你必须按下 F10 来获取菜单。在那里,按下 f 然后按下 e。这会召唤文件菜单,然后是它的退出选项,返回到命令行,并在一些更改的文件需要提交到磁盘时提示保存。
如前一节所述,使用 g++ 编译需要包含适当的标志。gcc 通常会将可执行代码绑定到 cygwin1.dll 文件,除非你的 gcc 标志明确包含 "-mno-cygwin" 作为开关。为了解决这个问题,你可以使用已知的 Unix 选项将此开关和其他所有开关添加到你的 .bashrc 文件中
在你的 Cygwin 主目录中,使用任何编辑器打开 .bashrc 文件。查找以“alias”开头的行。在那里,你将看到一些经过调整的 shell 命令,以便具有特定的选项。在包含以下内容的行下方
alias l='ls -CF'
你可以添加
alias g++='g++ -mno-cygwin' #do not depend on cygwin1.dll on target system
如果你需要添加更多微调标签,你可以在 "-mno-cygwin" 开关之后将它们添加到同一行,或者重新定义 g++ 命令的别名,以便 shell 将 g++ 的当前含义叠加到更多标签中。例如,你可以添加
alias g++='g++ -Wno-deprecated' #silence deprecation talk.
以防止 g++ 编译器提醒你使用 <string> 而不是现在已弃用的 <string.h> 头文件。
Cygwin 的创建考虑了一些差异。它没有不同的 root 帐户,虽然它可能会声称文件归 Administrator 用户所有。虽然这可能超出了本书的范围,但值得说几句话,你不会轻易地能够实验在不同用户权限下运行的程序,因为 Cygwin 似乎没有试图强制执行帐户安全性。你可以阅读 Windows 允许 Cygwin 访问的操作系统中的任何文件。
本页的 Windows 编程 图书是一个存根。你可以通过扩展它来提供帮助。