我在windows上使用visual studio,我有一个名为windows.h的头文件,当然它可以让我访问win32 API。
但当我尝试使用其他平台API时,比如linux API。我找不到任何具有该名称的头文件,这意味着我不能使用除windows、之外的任何其他操作系统API
现在的问题是:例如,如果我不想制作一个跨平台的程序怎么办?当我没有适当的权限访问它的API时,我试着做了一段时间的研究,但没有得到任何答案,这现在真的很困扰我,所以更具体地说,这些是我的问题:
1-为什么我只能在所有其他操作系统中使用windows API?是因为我在窗口上编码,所以如果我在窗口中编码";其他地方";会有所不同吗?还是与编译器本身有关?
2-如果我想使用另一个API,我必须使用外部库吗?如果是这样的话,c++中的标准库是如何跨平台的,我的意思是,如果是跨平台的话,那么应该存在库提供的其他特定于平台的头,对吧?
我在windows上使用visual studio,我有一个名为windows.h的头文件,当然这让我可以访问win32 API。
严格来说,windows.h
有点像元标头。windows.h
中定义了一些重要的宏、令牌和符号,但它也引入了许多其他标头。如果您查看每个Win32 API函数的参考手册,它会告诉您该函数在哪个标头中声明。让我们看看CreateFileA例如:在参考手册的底部,您会发现:
要求
支持的最低客户端Windows XP[仅限桌面应用程序]
支持的最低服务器Windows server 2003[仅限桌面应用程序]
目标平台Windows
标题
fileapi.h
(包括Windows.h
)
库内核32.lib
DLL Kernel32.DLL
因此,这条消息告诉我们,CreateFileA实际上是在fileapi.h
中声明的,并从kernel32.dll
系统库导出。
但当我尝试使用其他平台API时,如linux API实例
也就是说,因为没有linux.h
API头(如果您在Linux开发系统中搜索名为linux.h
的文件,您会发现很多,但这些文件不用于系统级API)。
原因是Linux没有自己的专有API,而是遵循操作系统API的POSIX行业标准,以及Open Group维护的单一Unix规范
当然也有特定于Linux的API,但您可以放心地忽略它们,因为";通常的";应用程序开发;如果您正在做低级工作,比如编写C运行库或自定义内存分配器,那么您需要这些。
作为开发人员,您最感兴趣的是第2节(对操作系统内核的调用=syscalls)和第3节(库函数)中的手册页。https://linux.die.net/man/
等效于CreateFileA
的POSIX将是open
,您可以在第2节中找到:https://linux.die.net/man/2/open(或者creat
系统调用,由于遗留的原因而存在,但没有人使用它(或者应该使用它))。
如果你看看打开它的手册页,告诉你
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)中进行了解释,对于它们应用的功能,也在相应的手册页中提到。
我找不到任何具有该名称的头文件,这意味着我不能使用任何其他操作系统API除了windows,
找不到它并不意味着它不存在。
现在的问题是:例如,如果我不想制作一个跨平台程序怎么办?
然后将所有特定于平台的内容写入一个单独的.c
文件,该文件封装了操作系统的内容。
当我没有适当的权限访问其API 时
好吧,你知道。
1-为什么我只能在所有其他操作系统中使用windows API?
因为你做不到。Windows.h
仅在Windows系统上可用。
2-如果我想使用另一个API,我必须使用外部库吗?
然后你就用它。
请记住,在Linux中,图形环境不是主操作系统的一部分。事实上,这是一个在系统启动时自动启动的常规程序。因此,您在上述手册页中找不到相关文档。
Linux的默认图形环境是Xorg(X11显示系统的开放实现)。还有Wayland,但经过10多年的开发,它仍然得不到很好的支持,还有很多不足之处。
若要在与Win32相同的级别上对X11进行编程,就必须处理Xlib或Xcb。然而,直接的X11编程是相当乏味的。您可能想要使用一些不错的应用程序框架,如Qt或GTK。Qt本身就是一个跨平台的框架,所以如果你限制自己只使用Qt函数,那么你的程序将完全跨平台,而不需要额外的努力。如果您想在GPU上进行3D图形处理,请使用跨平台API OpenGL或Vulkan。
但当我尝试使用其他平台API时,例如linux API。我找不到任何名为的头文件
系统API没有名为<linux>
的头。POSIX操作系统规范(Linux遵循该规范)列出了几个标头,其中包含您可能在该系统上的windows.h中找到的功能。POSIX规范与C标准库重叠,并且C标准库实现还提供了特定于POSIX的头。有关标头的完整列表,请参阅Linux手册或POSIX规范。
如果我想使用另一个〔系统〕API 怎么办
您至少需要该API的头文件才能编译调用它们的程序。此外,您还需要库档案来链接您的程序。您需要告诉编译器您要针对的是哪个系统。默认情况下,所有编译器都假定您的目标是运行编译器的系统。您需要查阅编译器的文档,了解交叉编译是否可行,以及如何进行
或者更简单的方法:在提供API的系统上编译。收割台可能需要单独安装。
。。。c++跨平台中的标准库如何
每个系统都有自己的标准库。标准库的一些实现是跨平台的,但不是全部。例如,libstdc++是GNU项目的标准库,也是Linux中的默认标准库,可在包括Windows在内的许多平台上使用。相比之下,Msvc标准库仅在Windows上可用。
- 关于
windows.h
库的维基百科说:
windows.h
是C和C的Windows特定头文件++包含所有Windows API中的函数,Windows使用的所有常见宏程序员,以及各种函数和子系统。
- Linux不像Windows那样为窗口管理提供默认的API,因此如果您正在编程图形应用程序,则还需要选择窗口库
第一部分的答案是肯定的。您只能使用Windows API,因为您在Windows上编程。但是,您可以在Windows上运行Linux。一个名为Windows Subsystem for Linux的Microsoft产品允许您这样做。但是,即使你这样做,你也找不到一个名为linux.h的头,它比这更复杂。还有一个产品(我相信叫WINE)可以让你在Linux上使用Windows API,尽管我相信它有一些问题。
标准库接口是跨平台的,但它的实现肯定不是。它通过抽象操作系统特定的功能来实现这一点。如果你看看这个库是如何在不同的平台上实现的,你肯定会看到很多不同。