【问题标题】:Remote development of Visual C++ applications from Linux从 Linux 远程开发 Visual C++ 应用程序
【发布时间】:2017-10-16 09:40:30
【问题描述】:

远程开发 Linux Windows 很容易通过 SSH 实现。

但是,另一种方式呢?我需要在 Windows 上构建和调试我的 Visual C++ 应用程序,但我想在 Linux 系统上工作。

  1. 由于特定于 MSVC 的库,无法通过 MinGW 进行交叉编译
  2. Windows 上的 Ubuntu 是一个好的开始,但我想在真正的 Linux 系统上工作
  3. RDP/VNC 或类似的东西也无济于事,因为我会再次在 Windows 上工作
  4. 虚拟机也是如此

可能类似于 Linux 上的 Powershell + SSH 到 Windows Powershell?

【问题讨论】:

  • 如果在 Windows 端启用了远程管理,您可以Enter-PSSession 到远程 Windows 机器。您不能以这种方式编辑文件,但您应该能够运行命令行构建工具。

标签: linux windows powershell visual-c++ ssh


【解决方案1】:

我经常从 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 等)集成。

使用代码

我们可以根据我们的工具和命令行的舒适度从多个工作流程中进行选择:

  1. 完全基于文本 - 所有工作都通过 SSH 会话执行
  2. 对挂载在远程文件系统中的文件使用本地工具
  3. 使用本地工具并同步文件

我使用第一种方法。我是一个重度 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 的库链接时可能会出现一些问题。

【讨论】:

  • 哇,感谢您的深入回答!我知道 Cygwin & Co(事实上,我在我的机器上使用 MSYS 和 WSL)。然而,我真正想要的是在完整的 Linux 环境中工作——我只是更喜欢它的窗口管理器、应用程序和可定制性。
  • @Julius 我听到了——我也更喜欢 Linux 桌面。我想你明白我建议 Cygwin 等,仅作为服务器。我们会从我们工作的 Linux 机器上连接到那些。如果你喜欢 GUI 编辑器,带有 C++ extension 的 VSCode 在打开从远程 Windows 机器本地安装的项目时应该为我们提供一个不错的开发环境(IntelliSense 等)。不幸的是,我们仍然坚持使用 Visual Studio 进行调试,但是无缝 rdp 让我们可以像使用原生应用一样使用它。
【解决方案2】:

我不知道您的所有要求,但也许您可以在 Windows 上使用 gdbserver(来自 MinGW)并在 Linux 上使用 VSCode 进行远程调试 - 或您喜欢的任何其他环境。您可以在此帖子 here 中找到更多详细信息。 (请注意,VSCode 会阻止您运行 gdb,除非它已按照第一个链接中所述进行签名。)
还有一个Native Debug VSCode 扩展可能会有所帮助。

我能想到的另一个解决方案是使用Visual Studio Online(对最多 5 人的小型团队免费)作为构建服务器。

正如您所说,反之亦然,现在甚至是 Visual Studio 2017 的 officially supported

很可能,Windows 的 VS remote debugging tools 对你没有帮助。

【讨论】:

    猜你喜欢
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-14
    • 1970-01-01
    • 2019-12-07
    相关资源
    最近更新 更多