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

Posted

技术标签:

【中文标题】在 Windows 和 Linux 下开发的 C++ 程序的区别【英文标题】:The difference between a program in C++ developed under Windows and Linux 【发布时间】:2010-02-28 02:33:31 【问题描述】:

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

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

【问题讨论】:

如果您询问在 Linux 上在 Windows 下编译开发的代码,简短的回答是没有任何理由在 Windows 中开发的代码不会编译 i> 在 Linux 上,反之亦然(只要使用 C++ 标准库)。当一个包含不属于 C++ 标准库的库并且是 Windows 独有的库时,就会出现不兼容性,反之亦然。例如,Linux 上没有 Windows GDI。但是,有跨平台工具包可以用来代替专有工具(例如 Gtk、Qt 等),从而可以在 Windows 和 Linux 上轻松编译。 【参考方案1】: Windows 和 Linux 使用不同的容器格式来保存可执行代码(PE 与 ELF)。 Windows 和 Linux 具有完全不同的 API(除了只使用 CRT 和 STL 的琐碎程序) Windows 和 Linux 的目录结构完全不同

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

这可以通过使用Wine来解决。

【讨论】:

CRT 窗口也不是特定的吗?【参考方案2】:

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

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

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

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

【讨论】:

sf.net/projects/line“通过拦截 Linux 系统调用在 Windows 上执行未修改的 Linux 应用程序”——与 Wine 正好相反。不过,它已经很久没有维护了。 酷...可惜他们没有维护它。您是否尝试过让任何程序在其下运行? 不,我不使用 Windows,所以我从未尝试过 LINE。我听说有些代码被折叠到umlwin32.sf.net 中(顺便说一下,这就像ring3k.org 的倒数),但这也没有得到维护。我也看不出有什么意义:Linux 上的几乎所有东西都有可用的源代码,因此移植和重新编译比进行此类黑客攻击更容易。【参考方案3】:

简而言之,

Windows 运行PE format executables Linux 运行ELF format executables

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

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

【讨论】:

【参考方案4】:

每个操作系统都定义了一个 API。如果您编码调用Win32 API,它不会在Linux 上。如果您使用 POSIX API 编写代码,它不会在 Windows 中直接出现在您身上。

要了解更多信息,请下载一个重要的开源程序(例如,Perl 或 Python)并查看其“配置”脚本如何安排在任一位置进行编译。

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

C++ 本身是可移植的。但有些 C++ 库不是。如果一个 C++ 程序使用了一些不可移植的库,那么这个程序是不可移植的。

例如,一个 C++ 程序使用MFC 来绘制 GUI 的东西,因为 MFC 只在 Windows 中支持,所以这个 C++ 程序不能直接在 Linux 上编译或运行。

【讨论】:

公平地说:它可能可以,特别是如果它是针对具有非常好的 MFC 实现的 Winelib 重新编译/链接的。 (尽管您关于库/API 可移植性的观点是正确的。)【参考方案8】:

有两个主要原因。

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

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

这是针对本地程序的...无论如何,有Java 和Python 语言...它们确实是跨平台的,但是为了可移植性,您必须牺牲速度。

【讨论】:

【参考方案9】:

这是一个很大的话题。

    首先,Windows 和 Linux 不是二进制可比的。这意味着即使是最简单的程序也无法从一台机器识别到另一台机器。这就是为什么 php、Perl、Python 和 Java 等解释型语言变得如此流行的原因,但即使这些语言也并非都支持每个平台上的相同功能集。

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

【讨论】:

以上是关于在 Windows 和 Linux 下开发的 C++ 程序的区别的主要内容,如果未能解决你的问题,请参考以下文章

windows下eclipse搭建android_ndk开发环境

Linux环境下C编程指南的内容简介

java jni 怎么在windows环境中编译成linux下的so文件

怎么样把windows下的java程序放到linux下运行~!

C语言入门开发:Windows下安装vscode编写C语言代码

linux下C++开发工具