gpt4 book ai didi

c++ - C++ 应用程序是跨平台的吗?

转载 作者:IT老高 更新时间:2023-10-28 13:57:46 25 4
gpt4 key购买 nike

作为学生,我学到的第一件事就是 C++ 应用程序不能在不同的操作系统上运行。最近,我读到基于 Qt 的 C++ 应用程序到处运行。那么发生了什么? C++ 应用程序是否跨平台?

最佳答案

  • 源代码兼容。如果我编译源代码,它会到处运行吗?
  • API/ABI 兼容性。操作系统是否以代码能够理解的方式为其组件提供接口(interface)?
  • 二进制兼容性。代码是否能够在目标主机上运行?

  • 源代码兼容
    C++是一个标准,它定义了如何读取和写入结构、内存、文件。
    #include <iostream>
    int main( int argc, char ** argv )
    {
    std::cout << "Hello World" << std::endl;
    }

    为处理数据而编写的代码(例如 grepawksed )通常是跨平台的。

    当您想与用户交互时,现代操作系统有一个 GUI,它们不是跨平台的,并且需要为特定平台编写代码。

    图书馆如 qtwxWidgets有多个平台的实现,并允许您为 qt 编程而不是 WindowsiOS ,结果与两者兼容。

    这些匿名库的问题在于,为了跨平台的一致性,它们剥夺了平台 X 的一些特定优势。

    这方面的例子在 Windows使用 WaitForMultipleObjects函数,它允许您等待不同类型的事件发生,或者 fork UNIX 上的函数,它允许进程的两个拷贝以重要的共享状态运行。在 UI 中,表单的外观和行为略有不同(例如颜色选择器、最大化、最小化、在窗口外跟踪鼠标的能力、手势行为)。

    当您需要完成的工作对您很重要时,您可能最终想要编写特定于平台的代码来利用特定应用程序的优势。
    C图书馆 sqlite是广泛的跨平台代码,但它的低级 IO 是特定于平台的,因此它可以保证数据库的完整性(数据真正写入磁盘)。

    因此,诸如 Qt 之类的库确实可以工作,但它们可能会产生不令人满意的结果,并且您最终不得不编写 native 代码。

    API/ABI 兼容性

    不同版本的 UNIX 和 Windows 相互之间具有某种形式的兼容性。这些允许为操作系统的一个版本构建的二进制文件在其他版本的操作系统上运行。

    在 UNIX 中,您选择的构建机器定义了兼容性。您希望支持的最低操作系统版本应该是您的构建机器,它将生成与后续次要版本兼容的二进制文件,直到它们进行重大更改(弃用库)。

    在 Windows 和 Mac OS X 上,您选择一个 SDK,它允许您针对一组具有相同问题的操作系统进行重大更改。

    在 Linux 上,每个内核修订版都与其他任何 ABI 不兼容,并且需要为每个内核修订版重新编译内核模块。

    二进制兼容性

    这是 CPU 理解代码的能力。这比您想象的要复杂,因为 x64 芯片能够(取决于操作系统支持)运行 x86 代码。

    通常,C++ 程序被打包在一个容器(PE 可执行文件,ELF 格式)中,操作系统使用它来解压缩代码和数据部分并加载库。这使得最终的程序同时具有二进制(代码类型)和 API(容器格式)形式的不兼容。

    同样在今天,如果您编译一个 x86 Windows 应用程序(在 Visual Studio 2015 上针对 Windows 7),那么如果处理器没有 SSE2 指令(大约 10 年前的 CPU),代码可能无法执行。

    最后,当 Apple 从 PowerPC 更改为 x86 时,他们提供了一个仿真层,允许旧的 PowerPC 代码在 x86 平台上的仿真器中运行。

    所以总的来说,二进制不兼容是一个模糊的领域。有可能产生一个识别无效指令(例如 SSE2)并在故障中模拟行为的操作系统,这可以随着新功能的出现而更新,并保持您的代码运行,即使它是二进制不兼容的。

    即使您的平台无法运行某种形式的指令集,它也可以被模拟并且行为兼容。

    关于c++ - C++ 应用程序是跨平台的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33238345/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com