20

我知道要在 Windows 上运行 c++,您需要专门为 Windows 编译,对于 linux 和 on...

但是,例如,如果我正在为用原生 c++ 编写的 Windows 编译程序,我可以在新安装的 Windows pc 上运行它吗?我的意思是,不用下载visual c++运行时库等,我可以编译它,比方说,在我的电脑上重新安装windows,然后运行它而不安装任何其他东西?

(上面的问题以 Windows 为例,但同样的事情可以在新安装的 linux 发行版上完成?例如 Ubuntu)提前谢谢。

4

4 回答 4

20

唯一的答案是“这取决于”。

操作系统可以通过多种方式“运行”程序,可以通过多种方式构建程序,并且可以通过多种方式组装代码。

仅使用“标准库”并静态链接所有库的程序不需要任何其他依赖项(从某种意义上说,它需要的所有代码都在二进制文件本身或作为系统本身一部分的操作系统库中)已经在系统上)。

但:

  • 静态链接标准库(很可能存在于所有程序中)会膨胀相同代码的许多副本的内存使用量。这就是库经常动态链接的原因,但这也需要“安装”这些库

  • 仅使用标准库的程序只能执行所有系统中以某种方式“常见”(或可以普遍表示)的事情,从而失去了使操作系统与另一个操作系统不同的所有特性。

  • 有些“平台”——就其外围设备的性质而言——并没有相互呈现:一台咖啡机有 12 个按键和一个 2 行 x 20 列的文本显示器。一台 PC 有一个鼠标、一个键盘和一个显示器,其宽度甚至可以达到 10,000 像素,每个显示器都有数百万种颜色。平板电脑有一个触摸表面,可以同时抓住多个点。你能想象在所有这三个平台上运行相同的程序吗?

于 2013-02-04T20:35:46.360 回答
1

不。通常不同系统上的库是不同的。如果您的程序涉及任何 GUI,那么您肯定会拥有不会在其他操作系统上运行的操作系统特定代码。

如果您编写一个针对 g++ 编译器而没有 GUI 代码的 C++ 程序,则可能仍有一些特定于操作系统的代码。但是您应该能够以最小的努力移植它。

如果您的程序仅使用 stl 和 stdio,那么它可能是可移植的。例如,MS STL 的 ::c_str() 函数与 linux 函数的工作方式略有不同。

于 2013-02-04T20:13:28.090 回答
0

对于它的价值,当使用 MinGW 与 libc 和 libc++ 的静态链接时,你的 C++ 应用程序很可能会在任何 Windows 系统'95 及更高版本上运行,除非你在 Windows API 中特别启用了不可用的功能,比如新台币的特点。我为 Windows 7 编译的所有 SDL 应用程序(当然编译为 32 位)在我的 '95 机器上都可以正常工作。

部署 Linux 应用程序时,最好只提供源代码以及配置脚本或 makefile。这将确保用户对您的应用程序具有有效的依赖关系。如果您愿意,您可以将二进制文件部署到特定的包管理器。

于 2013-02-04T20:37:47.727 回答
-1

是的,标准库无处不在。想想看,你得到的大多数程序都是用 C/C++ 编写的。只有当您使用某些指定的库(如 winsock 等)时才会出现依赖关系,因此某些 Windows 应用程序不太可能在 linux 上运行,反之亦然。

于 2013-02-04T20:12:56.403 回答