【问题标题】:C++ opening a window without libraries [closed]C ++打开没有库的窗口[关闭]
【发布时间】:2021-06-30 07:47:27
【问题描述】:

我是 C++ 新手,我想知道以供将来参考:

是否可以在没有任何库(如 Win32 API、GTK、QT 等)的情况下打开(跨平台兼容)窗口?

如果不是,谁能解释一下原因?

操作系统如何启动 GUI?即使它对汇编这样做,C++ 也可以做汇编可以做的事情(据我所知,如果我弄错了,请告诉我)。

我找到了一篇关于同一主题的帖子,但所有答案都说你不能避免 API,但他们没有提到为什么?

C++ How do you make a simple window without the Win32 API?

问题

  1. 是否可以在没有 API 调用或任何外部库的情况下创建 GUI?

  2. 如果不是,为什么以及操作系统如何启动 GUI?

  3. C++ 能做汇编能做的所有事情吗? (我真的不在乎这个,因为我想我可以在谷歌上找到答案,如果有人回答,我很感激)。

【问题讨论】:

  • 你找不到解释为什么不能这样做的原因与你会被告知除非你有汽油/汽油你不能让你的汽车前进的原因是一样的它的坦克,没有完整的解释和物理、化学和工程方面的教程。
  • 是否可以在没有 API 调用或任何外部库的情况下创建 GUI? 不可以。c++ 在语言。
  • @drescherjm 你知道一本关于它的好书吗? (无论如何我都会搜索,但如果你能给出名字,我将不胜感激)
  • 如果它是现代操作系统而不是嵌入式系统,则操作系统将具有与 GPU 或图形硬件通信的设备驱动程序。然后,您拥有与这些设备驱动程序或操作系统通信的其他软件。其中一些可能是directX、opengl、vulkan...

标签: c++ user-interface assembly operating-system window


【解决方案1】:
  1. 是否可以在不调用 API 或任何外部库的情况下创建 GUI?

没有1

1:除非,例如,您正在编写自己的显示驱动程序并且可以直接访问视频硬件。

  1. 如果不是,为什么

每个操作系统处理 UI 编程的方式都不同。您必须使用运行程序的每个操作系统(即 Windows 上的 Win32 等)提供的 UI API。 C++ 中没有内置通用 UI 框架,因此如果您想编写跨平台 UI,那么您将不得不使用第三方库(即 Qt、GTK 等),或者编写自己的封装每个操作系统的库- 将特定 API 转换为供您的代码使用的通用接口。

操作系统如何启动 GUI?

它没有。它只是执行你的程序,仅此而已。然后程序决定在运行时做什么。如果程序想要显示 GUI,则必须根据需要调用 OS 提供的 UI API。

  1. C++ 能做汇编能做的所有事情吗?

或多或少,是的2。 C++ 是一种编译语言,它可以生成直接在 CPU 上运行的机器代码,就像 Assembly 一样。此外,许多 C++ 编译器实际上支持在 C++ 代码中直接嵌入实际汇编指令的能力。 C++ 不使用必须在运行时翻译成机器码的中间字节码,就像脚本/解释语言使用的那样。

2:并非所有 CPU 指令都可以直接执行,如果您的程序尝试执行操作系统不希望您访问的指令(例如,用于直接硬件访问的指令),操作系统会进行干预)。

【讨论】:

  • 对于这个问题,件重要的事情可以用 asm 做,而用 C++ 做不到。 3. 的答案是否定的。在 asm 中,您可以使用类似 syscall 的指令(例如在 x86-64 上)直接调用操作系统的 API。例如,在 x86-64 GNU/Linux 上,打开 GUI 窗口通常会涉及 libX11 通过调用 libc 中的包装函数进行 socket / connectread/write 系统调用。如果您愿意,您可以自己在 asm 中重新实现所有这些(或使用一些 asm 包装器来处理最低级别的东西)。它不会是便携的,但组装本身就不是。
  • 或者在 Windows 上,github.com/j00ru/windows-syscalls 在各种 Windows 版本上具有反向工程的系统调用调用号。 (与 Linux 不同,Windows 不会向用户空间公开稳定的系统调用 ABI,因此调用编号可以在版本之间更改,甚至在相同版本的构建之间更改。支持的 Windows 方式是调用 DLL。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-20
  • 1970-01-01
相关资源
最近更新 更多