【问题标题】:Native windows c++ programming?本机windows c++编程?
【发布时间】:2015-08-05 21:25:58
【问题描述】:

我有一个关于原生 c++ 以及其他在 windows 上编程的快速问题——我最近在我自己的计算机上用 Visual Studio 编写了一个小型 c++ 程序,它为我做了一些数学运算。我成功编译它并将 .exe 从 VS 调试文件夹移动到我的桌面。它在我的计算机上运行良好,无论 .exe 位于何处。但是后来我把程序给了我的朋友,当他尝试运行它时,它说他缺少各种 dll 文件。现在我有一种感觉,这是因为 VS 中包含一个 c++ 环境,它允许它在我的而不是他的上运行。但我的问题是,为什么程序最初是用什么语言编写的?不就是把它编译成.exe,把代码变成机器语言,这样不管有没有开发工具,它都可以在任何电脑上运行吗?

【问题讨论】:

  • 使用静态链接或安装可再发行包。可再发行包不太方便,但如果有修复程序,则无需重新编译程序即可对其进行更新。
  • 编译时的静态链接?以及我想在其上运行程序的每个系统上的 redist 包?
  • 不,只做一个另一个。要么静态链接到 C 运行时(我假设它缺失),要么让你的朋友安装适当的 VC++ 可再发行包。您可以使用 Dependency Walker(在您朋友的机器上)来查看缺少哪些 DLL-s,但如果您的程序很小并且您没有添加任何显式的 3rd-party DLL 依赖项,那么它可能只是 C 运行时.
  • 静态链接会给你更大的 exe 文件,但几乎所有东西都会被编译成可执行文件(除了 3rd-party 的东西)。

标签: c++ windows compilation native environment


【解决方案1】:

编译调试版本将动态链接到非 Windows 标准的 dll 文件的调试版本。技术上/法律上也不允许您重新分发 dll 文件的调试版本。编译一个发布版本,或者包含任何你链接到你的 exe 文件的 .dll 文件。您可能还需要担心目标计算机是否安装了正确的 Microsoft Visual Studio C++ Redistributable Packages。

或者,您可以通过在项目属性中的代码生成下设置运行时库->多线程 /MT 来静态链接,从而绕过 dll 地狱,尽管由于各种原因我不会深入,但通常不赞成这样做。

【讨论】:

    【解决方案2】:

    理论上,Exe 文件可以在任何具有合适 CPU 等的计算机上运行。
    (与您的操作码“语言”相同)。

    实际上,主要有两个问题:

    a) 程序文件包含的不仅仅是 CPU 命令,具体内容和方式取决于您的操作系统等。 Exe (PE) 文件通常在 Windows 中使用,虽然理论上可行,但 Linux 不会运行它,因为没有人对其进行编程以理解 Exe 文件(还有像 Wine 这样的附加软件,可以 em> 在 Linux 上运行 Exe,但必须单独安装)

    b) 您不是从头开始编写操作系统的所有内容,而是依赖于您可以使用许多预先存在的功能。如您所知,这些必须存在才能运行您的程序。问题是,Visual Studio 假定存在故意不属于 Windows 本身的库。随每个 Windows 安装一起提供它们不会有问题,但 Microsoft 选择将它们作为单独的下载(cmets 中提到的 Redist. 包)。要在不依赖其他库文件的情况下尽可能多地填充 Exe 文件,请为您的项目使用静态链接选项。

    【讨论】:

      【解决方案3】:

      此问题与语言无关。如果您缺少依赖项/库,任何东西,当然会大喊大叫。它期望使用来自其他 dll 的代码来知道如何做某事。

      一个很好的例子是当你运行一个 .exe 并且它说嘿!我们注意到您缺少此驱动程序/文件/依赖项,然后它会将您带到其他一些点击以获取它。

      【讨论】:

      • 所以我期望 .exe 能够在任何系统上运行是正确的吗?编辑:缺少的 dll 是 MSVCP120D.dll
      • 那是 C 调试运行时。
      • 不,你错了。即使任何机器都可以运行它也不能保证他的机器和你有相同的库。
      • 所以这是一个假定的依赖问题,而不是环境问题?
      • 这是一个依赖问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      • 1970-01-01
      • 1970-01-01
      • 2015-01-02
      • 1970-01-01
      • 2013-03-06
      相关资源
      最近更新 更多