我经常从 Linux 远程开发 Visual C# 应用程序,而不是 MSVC,但和你一样,我想找到一种方法来在远程 Windows 机器上构建和调试面向 Windows 的应用程序和库,而无需直接在使用 RDP、Visual Studio 等的 box。
如果没有更多关于您喜欢在 Linux 上为您开发的应用程序类型使用的开发和调试工具的信息,很难回答这个问题。我将尝试提供一般概述并更新您添加的有关工作流程的详细信息的答案。
Cygwin,类似于MinGW's MSYS,为Windows 提供类Unix 环境。最重要的是,与 MinGW/MSYS 不同,Cygwin 包含一个 OpenSSH 服务器的实现,它使我们能够通过 SSH 从 Linux(或任何其他具有 SSH 客户端的设备,真的)连接到 Windows 机器。我们可以使用 Cygwin 的安装实用程序安装 sshd 包。连接后,Cygwin 默认将我们放入 Bash shell。有了这个能力,我们可以:
- 通过 SSH 执行远程命令和脚本。
- 使用我们最喜欢的 *nix 命令行文本编辑器(Vim、Emacs 等)编辑文件
- 使用SSHFS 在本地装载远程文件系统(如果Windows 共享不可用)。
- 如果需要,转发或隧道端口。
通用外壳的可用性使几乎一切成为可能。除了 Linux 脚本和 Cygwin 程序之外,我们还可以从 Cygwin 的 shell 环境中执行批处理文件、PowerShell 脚本和本机 Windows 可执行文件。
例如,我们可以从 SSH 会话命令行run msbuild 来构建我们的 VC++ 应用程序,或者我们可以配置本地 GUI 编辑器或在 Linux 中运行的 IDE,以便在单击时通过 SSH 执行 msbuild “构建”按钮。
我们可以使用Windows Subsystem for Linux(“WSL”,Windows 上的 Bash)在最新版本的 Windows 中设置类似的环境。我个人更喜欢 Cygwin,因为它具有更大的可移植性和易于配置。 Cygwin 的 sshd 可以作为 Windows 服务运行,并且,作为一个已建立的项目,Cygwin 将 很好地 与 Windows 系统(用户帐户、文件系统、Windows API 等)集成。
使用代码
我们可以根据我们的工具和命令行的舒适度从多个工作流程中进行选择:
- 完全基于文本 - 所有工作都通过 SSH 会话执行
- 对挂载在远程文件系统中的文件使用本地工具
- 使用本地工具并同步文件
我使用第一种方法。我是一个重度 Vim 用户,所以我通过 SSH 连接到 Windows 机器,使用 Cygwin 提供的工具和环境在命令行上完成我的工作。 Linux 上常见的工具的可用性简化了许多在默认 Windows 控制台中难以完成的任务。我们可以编写 shell 脚本来自动执行 Visual Studio 通常为我们执行的任务。例如,我围绕 mstest 编写了一个包装脚本,它读取 XML 测试结果并以易于在终端中阅读的格式输出它们。
如果我们更喜欢使用 GUI 编辑器或 IDE,我们可以在本地挂载远程代码,这样工具就可以读取和写入文件,就好像它们是 Linux 机器本地文件系统的一部分一样。我们可能仍需要使用 SSH 来执行构建项目所需的命令,但许多编辑器允许我们将此命令配置为项目的“构建”操作。
有时远程文件系统太慢而无法进行有效编辑。在这些情况下,我们可以使用 rsync 之类的工具或编辑器的“保存时上传”功能(例如,通过 SFTP)在 Linux 开发机器和 Windows 主机之间同步文件(如果可用)。
调试
在我们尝试找到调试应用程序的方法之前,一切都运行良好。截至目前,在处理 Visual C++ 项目时,没有合理的替代品可以替代 Visual Studio 的调试器。我们可以使用MDbg 调试在 CLR 上运行的托管 C# 应用程序,但没有可用于 C++ 程序的类似工具。
我们可以尝试使用 gdb(来自 MinGW、Cygwin 等)对本机二进制文件进行基本的低级调试,例如读取内存地址,但调试器尚不支持读取 Microsoft 的调试符号,所以调试经验非常有限。 Microsoft began documenting 几年前的 PDB 格式,因此我们可能会在未来看到一些兼容性。即便如此,要为 Visual Studio 的出色调试工具提供令人满意的替代方案仍需要很长时间。
对于调试,RDP 目前是我们最好的——可能也是唯一的——选项。为了获得更原生的体验,我们可以使用rdesktop(或其他 RDP 客户端)和seamlessrdp 运行 Visual Studio,以创建 Visual Studio IDE 的单窗口 RDP 会话,而不是与任何窗口集成的完整桌面我们在 Linux 上使用的管理器。
有时,我们可以通过将跟踪添加到将值输出到控制台或日志文件的应用程序来解决针对简单调试场景启动完整 Visual Studio 调试会话的问题。在许多情况下,这比启动调试器要快。
我们也可以尝试使用为 Visual C++ 工具链配置的Eclipse's CDT debugger。这可能使我们能够使用 Linux 机器上的 Eclipse 实例执行远程调试。我从未尝试过这种方法,我预计当应用程序与 Microsoft 的库链接时可能会出现一些问题。