我在 Windows 上使用 Visual Studio,我有一个名为 windows.h 的头文件,这当然可以让我访问 win32 API。
严格来说windows.h 是一种元标题。 windows.h 中定义了一些重要的宏、标记和符号,但它也引入了 很多 其他标题。如果您查看每个 Win32 API 函数的参考手册,它会告诉您该函数是在哪个标头中声明的。例如,让我们看看 CreateFileA: 在参考手册的底部,您会发现:
要求
支持的最低客户端 Windows XP [仅限桌面应用]
支持的最低服务器 Windows Server 2003 [仅限桌面应用]
目标平台窗口
标题fileapi.h(包括Windows.h)
库 Kernel32.lib
DLL Kernel32.dll
这告诉我们,CreateFileA 实际上是在fileapi.h 中声明的,并且是从kernel32.dll 系统库中导出的。
但是当我尝试使用 linux API 等其他平台 API 时
例子。
也就是说,因为没有 linux.h API 标头(如果您在 Linux 开发系统中搜索名为 linux.h 的文件,您会发现很多,但系统不使用这些文件级 API)。
原因是,Linux 没有自己的专有 API,但遵循操作系统 API 的 POSIX 行业标准和 Single Unix Specification maintained by the Open Group。 p>
当然有特定于 Linux 的 API,但您可以放心地忽略它们以进行“常规”应用程序开发;如果你在做低级的事情,比如编写 C 运行时库或自定义内存分配器,则需要这些。
作为开发人员,您最感兴趣的是第 2 节(调用操作系统内核 = 系统调用)和第 3 节(库函数)中的手册页。 https://linux.die.net/man/
等同于CreateFileA 的POSIX 将是open,您可以在第2 节中找到它:https://linux.die.net/man/2/open(或creat 系统调用,由于遗留原因而存在,但没有人使用它(或应该使用它) )。
如果您查看 open 的联机帮助页,它会告诉您
open(2) - Linux 手册页
名称
打开,创建 - 打开并可能创建文件或设备
概要
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
int creat(const char *pathname, mode_t mode);
这告诉你,为了使用open,你需要包含sys/types.h、sys/stat.h和fcntl.h。与 Windows 不同,没有包含所有内容的包罗万象的标题。这样做的原因是,出于向后和交叉兼容性的原因可以通过在包含标头之前将某些宏设置为特定值来配置标头公开的内容。这些在feature_test_macros(7) 中进行了解释,对于它们应用的功能,也在相应的手册页中提到。
我没有找到任何具有该名称的头文件,这意味着
我不能使用除 windows 之外的任何其他操作系统 API,
你找不到,不代表它不存在。
现在这里的问题是:如果我不想做一个跨平台程序怎么办?
然后你将所有平台特定的东西写入一个单独的.c 文件,该文件封装了操作系统的东西。
当我没有对其 API 的适当访问权限时
嗯,你会的。
1- 为什么我只能使用所有其他操作系统中的 windows API?
因为你不能。 Windows.h 仅适用于 Windows 系统。
2- 如果我想使用另一个 API,我必须使用外部库吗?
那你就用它吧。
请记住,在 Linux 中,图形环境不是主操作系统的一部分。它实际上是一个在系统启动时自动启动的常规程序。因此,您不会在上述手册页中找到相关文档。
Linux 的默认图形环境是 Xorg(X11 显示系统的开放实现)。还有 Wayland,但经过 10 多年的开发,它的支持仍然很差,还有很多不足之处。
如果您想将 X11 编程到与 Win32 相同的级别,则必须处理 Xlib 或 Xcb。然而直接 X11 编程是相当乏味的。您可能想要使用一些不错的应用程序框架,例如Qt 或 GTK。 Qt 本身是一个跨平台框架,所以如果你限制自己只使用 Qt 功能,那么你的程序将完全跨平台而不需要额外的努力。如果您想在 GPU 上制作 3D 图形,请使用跨平台 API OpenGL 或 Vulkan。