在Windows和Linux下开发的C ++程序之间的区别

时间:2010-02-28 02:33:32

标签: c++ windows linux

在Windows和Linux下用C ++开发的程序有什么区别?

为什么不能在Linux下使用在C ++下用Windows开发的程序?

9 个答案:

答案 0 :(得分:8)

本机程序不兼容,因为Windows具有完全不同于Linux的API集合。正如其他人所提到的,每个平台也使用不同的可执行格式。此外,两个平台都有自己的一组库,程序将链接和/或共享。例如,Windows程序通常使用特定于Windows的库(如MFCWin32 API等)在Visual Studio中开发。这些库在linux中不可用,因此程序甚至无法编译除非注意确保使用跨平台库(例如QT)。

但是,如果您小心,可以在代码中使用跨平台库,并且可以在两个平台下编译相同的程序。对于这样的程序,您需要仔细地将任何特定于平台的详细信息(文件系统位置等)放在他们自己的文件中。然后,您需要设置正确的#define语句和/或makefile指令,以确保每个平台的构建中都包含正确的文件。

当然,如果您使用“跨平台”语言(如Java或Python),并且在实现中不使用任何特定于平台的代码,那么您的程序可以在两种环境下运行。

注意虽然可执行格式不同,但在Windows上开发的某些程序可以在Linux下使用名为WINE的模拟器执行。

答案 1 :(得分:6)

  • Windows和Linux使用不同的容器格式来保存可执行代码(PE vs ELF)。
  • Windows和Linux有完全不同的API(除了仅使用CRT和STL的琐碎程序外)
  • Windows和Linux具有完全不同的目录结构

您可以编写一个程序,该程序可以使用任意一组API(例如,使用Qt),并且可以处理任一目录结构,但您仍然无法在两者上运行相同的文件操作系统,因为容器格式不同。

这可以通过Wine来解决。

答案 2 :(得分:3)

简而言之,

此外,即使有工具在PE和ELF之间进行转换,与Windows操作系统连接所需的程序指令在Windows和Linux之间也完全不同。只有最受限制的仅计算代码(只进行计算并且根本不与操作系统交互)可以在系统之间移植而无需特殊操作。但是,很少这样做。

我相信某些版本的Linux允许您直接加载专为Windows设计的设备驱动程序而无需重新编译。但是,这是一个非常特殊的应用程序,通常不使用该技术。

答案 3 :(得分:2)

每个操作系统都定义了一个API。如果您编写代码来调用Win32 API,它将不会出现在Linux上。如果您使用POSIX API进行编码,则不会在Windows中向您跳转。

要了解有关此内容的更多信息,请下载一个重要的开源程序(例如,PerlPython),并查看其“configure”脚本如何安排在任何一个位置进行编译。

答案 4 :(得分:2)

在平台上编译C ++程序时,它最终会变成机器可以理解的形式(即机器代码)。在后台,该程序使用系统调用来执行特权操作。这些系统调用是通过方法或API实现的。这些方法因平台而异。因此,在每个平台上,编译后的代码都是不同的。如果要为其他平台编译代码,可以使用许多交叉编译器。

答案 5 :(得分:1)

C ++本身就是可移植的。但是有些C ++库不是。如果C ++程序使用某些不可移植的库,则该程序不可移植。

例如,C ++程序使用MFC绘制GUI内容,因为MFC仅在Windows中受支持,因此无法直接在Linux上编译或运行此C ++程序。

答案 6 :(得分:1)

主要有两个原因。

理论上,某些语言(如C)的相同程序(源代码)可以在Windows和Linux上运行。但汇编只有不同;这意味着您必须为每个平台编译相同的源代码文件。

但实际上,每个操作系统都有一组不同的API。以及更快地完成工作的不同技术......这通常会吸引开发人员使用它们。而且他们不遵守标准,因此失去了便携性。

这适用于原生程序......无论如何,有JavaPython种语言......它们确实是跨平台的,但为了便携性,你必须牺牲速度。 / p>

答案 7 :(得分:1)

这是一个很大的话题。

  1. 首先,Windows和Linux不具有二进制可比性。这意味着即使是最简单的程序也无法从一台机器识别到另一台机器。这就是PHPPerlPythonJava这样的解释语言变得如此受欢迎的原因,但即使这些语言并非都支持每个平台上的相同功能集

  2. 库依赖/操作系统支持:任何显着复杂的程序都需要以某种方式访问​​系统,并且一个系统上的许多功能在另一个系统上不可用。有一百万个例子;只是看看Linux等效的空白或Windows等效的空白。超越OS支持应用程序主要是在函数库之上构建的,其中一些在两个系统上都不可用。

答案 8 :(得分:1)

不要过于迂腐,但开发程序与构建程序和执行程序不同。在许多情况下,可以构建和编译在一个操作系统上编写的程序以在另一个操作系统上执行。正如其他人所指出的,其他程序依赖于仅由特定操作系统或仅驻留在该操作系统上的库提供的某些功能。因此,必须在该操作系统上构建并运行它。