在另一台PC上运行C构建的.exe

问题描述 投票:3回答:3

我已经使用Visual Studio使用标准的C库和几个Windows库在C中构建了一个程序。

该代码仅获取用户输入(使用scanf,因此通过cmd窗口)根据输入进行一些计算并输出一些文本文件,就是这样。

我想知道接下来该怎么办才能在另一台标准Windows计算机上运行我的exe,而无需安装任何其他文件,例如整个Windows SDK。?

这仅仅是能够构建发行版本(而不是调试)的一种情况?

非常感谢

c exe release
3个回答
3
投票

如果选择正确的CPU目标(项目配置属性-> C / C ++启用增强指令集),则二进制代码不包含仅由CPU的子集非常窄,而Visual Studio的默认设置是使用最广泛的x86或x64 CPU支持的指令,那么程序几乎可以在任何Windows计算机上运行。但是,您需要分发不属于基本Windows安装的所有DLL,其中包括任何其他动态链接的语言运行时,例如Visual C ++运行时。

导出必须与可执行文件一起打包的DLL列表的一种好方法是创建一个带有全新Windows安装的虚拟机,其中没有任何开发工具,然后尝试在其中运行代码。如果您发现缺少DLL的错误,请添加并重复。当涉及到Visual C ++运行时时,Microsoft为允许在安装过程中分发的不同版本提供了可安装的程序包(Visual C ++任何可再发行程序包)。

此外,请注意,为32位Windows编译的程序大多数将在64位版本上运行,但事实并非如此。


3
投票

通常来说,C程序不是“可移植的”,这意味着它们无法复制到其他计算机上并且无法运行。

在一些例外情况下,可以在其他计算机上安全地运行C可执行文件:

  1. CPU支持相同的指令集,具有相同的兼容副作用集和可能的错误。
  2. 操作系统支持相同的系统api点,具有相同的兼容副作用集,并且可能具有相同的bug。
  3. 已安装的非操作系统库支持相同的api点,具有相同的兼容副作用集,并且可能具有相同的bug。
  4. 源(在其上构建代码的平台)和目标(在其上运行可执行文件的平台)之间的API调用约定是相同的。

当然,并非所有的CPU和OS都必须100%兼容,仅是编译程序所使用的部分(编译时并不总是很容易看到,而且源代码也不是100%相同。 )

为了满足这些条件,通常您使用的是同一版本的操作系统,或者由操作系统打包程序设计的兼容接口,该接口也支持当前版本的操作系统和较旧的版本。

关于如何最轻松地完成此操作的详细信息在不同的操作系统之间有所不同,通常来说,即使存在兼容层,您也需要进行适当的测试,因为尽管有可能使用多种操作系统,但副作用和错误往往会有所不同。系统兼容性。

最后,在某些环境中,可以通过在运行时模拟外部CPU指令集,使那些指令插入与当前CPU兼容的指令中,从而使不同的CPU可执行文件在操作系统(例如QEmu)上运行。这样的系统在非Linux操作系统中并不常见。并且,如果动态库的加载无法定位和加载外部指令集库,它们可能会失败。

有了所有这些警告,您就会明白为什么大多数人决定编写可移植的源代码并在每个目标平台上重新编译它们;或者,为多个平台上已经存在的解释器编写其代码。使用解释器方法,CPU从概念上讲是一个虚拟的CPU,在各个硬件之间实现相同,从而使您可以编写一组要在所有硬件平台上解释的源代码。


0
投票

我已经使用Visual Studio使用标准的C库和几个Windows库在C中构建了一个程序。

我想知道接下来该怎么办才能在另一台标准Windows计算机上运行我的exe,而无需安装任何其他文件,例如整个Windows SDK。?

您没有解释程序确实在做什么。它有图形用户界面吗?它是网络服务器吗?您有时间改善或增强它吗?它可以在命令行上运行吗?

为什么不能共享C源代码(例如,使用github)?

如果需要某些图形界面,请考虑使用GTK。 Windows has been ported

如果Web界面足够,请考虑在程序中使用libonion,或在C中为特定平台找到一些HTTP服务器库。

但是您需要了解的主要与linking有关,而不仅与C编程语言有关(请阅读n1570规范)。因此,请阅读有关Linkers and loaders的信息。

您应该首选static libraries它们的可用性是特定于平台的。了解有关Operating Systems的更多信息。另外,共享某些Microsoft Windows系统WinAPI库可能是非法的(即使在技术上可行),因此在向您的律师展示您所绑定的EULA之后,请咨询您的律师。

[我的观点是,Linux distributions在学习用C编程时非常友好(例如,使用GCCClang作为C编译器)。 UbuntuDebian均可免费下载,但实际上需要大约100 GB的连续可用磁盘空间。在安装其中一个重要数据之前,请确保备份它们。

您是否考虑过porting,将C代码改编并编译到WebAssembly?如果这样做,您的代码将在最新的Web浏览器中运行。还要查看BellardJSLinux

相关答案here。请注意,C can be transpiled to JavaScript然后在最新的Web浏览器中本地运行。

© www.soinside.com 2019 - 2024. All rights reserved.