'windows.h',其他平台呢? 名称简介

如何解决'windows.h',其他平台呢? 名称简介

我在Windows上使用Visual Studio,并且有一个名为windows.h的头文件,它当然使我可以访问win32 API。

但是当我尝试使用其他平台API(例如linux API)时。我找不到任何具有该名称的头文件,这意味着我不能使用Windows以外的任何其他OS API,

现在这里的问题是:如果我不想制作一个跨平台程序该怎么办?当我无法正确访问其API时,我曾尝试进行一段时间的研究,但无法获得问题的任何答案,这确实困扰着我,因此更具体地说,这些是我的问题:

1-为什么我只能在所有其他操作系统中使用Windows API? 是因为我在Windows上进行编码,所以如果我在“其他地方”进行编码,会有所不同吗? 还是与编译器本身有关?

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


库Kernel32.lib


DLL Kernel32.dll

这告诉我们, CreateFileA 实际上是在fileapi.h中声明的,并且是从kernel32.dll系统库中导出的。

但是当我尝试使用其他平台API(例如linux API) 例子。

也就是说,因为没有linux.h API 标头(如果您在Linux开发系统中搜索名为linux.h的文件,则会发现很多文件,但是这些文件并没有用于系统级API)。

原因是Linux没有自己专有的API,而是遵循POSIX操作系统API的行业标准和Single Unix Specification maintained by the Open Group

em>

当然有特定于Linux的API,但是对于“常规”应用程序开发,您可以放心地忽略它们。如果您正在做底层工作,则需要这些,例如编写C运行时库或自定义内存分配器。

作为开发人员,您最感兴趣的是第2节(对操作系统内核的调用= syscalls)和第3节(库函数)的联机帮助页。 https://linux.die.net/man/

相当于CreateFileA的POSIX将是open,您可以在第2节中找到:https://linux.die.net/man/2/open(或creat syscall,由于传统原因而存在,但是没有人使用(或应该使用))。

如果您查看打开的手册页,它会告诉您

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.hsys/stat.hfcntl.h。与Windows不同,没有包含所有内容的包罗万象的标头。这样做的原因是,出于向后和交叉兼容性的原因,可以通过在包含标头之前将某些宏设置为特定值来配置标头公开的内容。这些内容在feature_test_macros(7)中进行了说明,并且在相应的手册页中还介绍了适用这些功能的功能。

我找不到任何具有该名称的头文件,这意味着 除了Windows,我不能使用任何其他OS API,

仅仅是因为您找不到它,并不意味着它不存在。

现在的问题是:如果我不想制作一个跨平台程序该怎么办?

然后,将所有特定于平台的内容写入单独的.c文件中,该文件封装了OS内容。

当我没有适当访问其API的权限时

好吧。

1-为什么我只能在所有其他操作系统中使用Windows API?

因为你不能。 Windows.h仅在Windows系统上可用。

2-如果我想使用其他API,我必须使用外部库吗?

然后您只需使用它即可。

请记住,在Linux中,图形环境不是主要操作系统的一部分。实际上,这是一个常规程序,会在系统启动时自动启动。因此,您不会在上述手册中找到有关该文档的文档。

Linux的默认图形环境是Xorg(X11显示系统的开放实现)。还有Wayland,但是经过10多年的开发,它的支持仍然很差,还有很多不足之处。

如果要在与Win32相同的级别上编程X11,则必须处理XlibXcb。但是,直接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上可用。

,
  1. 关于windows.h库的Wikipedia说:

windows.h是用于C和C ++的 Windows专用头文件 编程语言,其中包含所有 Windows API 中的所有功能,Windows使用的所有常见宏 程序员,以及各种功能使用的所有数据类型和 子系统。


  1. Linux 没有像Windows一样提供用于窗口管理的默认API ,因此,如果您要对图形应用程序进行编程,则还需要选择一个窗口库。
,

第一部分的答案是肯定的。您只能使用Windows API,因为您正在Windows上进行编程。但是,您可以在Windows上运行Linux。 Microsoft称为Windows Linux子系统的Windows产品允许您执行此操作。但是,即使这样做,您也找不到名为linux.h的标头,它要比这复杂得多。还有一种产品(我相信是WINE)可以让您在Linux上使用Windows API,尽管我认为它存在一些问题。

标准库 interface 是跨平台的,但是它的实现当然不是。它通过抽象掉特定于OS的功能来实现。如果您看一下如何在不同平台上实现该库,您肯定会发现很多差异。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-