windows.h文件不存在 (在Linux上编译C代码)

9

我有一个包含头文件的C程序。这个程序在Windows上工作得很好,但是在Linux上编译代码时:

gcc main.c -Wall -o main

我得到了以下错误信息:

main.c:2:10: 致命错误:windows.h:没有那个文件或目录编译终止

你知道为什么会出现这个错误吗?有什么方法可以解决吗?

1
你需要将代码移植到Linux。 - Ed Heal
8
问题很明显:与Windows不同,Linux没有windows.h头文件。修复它更为复杂(您需要删除或替换任何特定于Windows的功能),而且如果没有看到您的代码的更多内容是不可能解决的。 - Keith Thompson
2
使用 windows.h 编写的代码不容易在 Unix 上运行。Windows API 与 Unix (Linux, POSIX) API 完全不同。您必须进行重大更改(函数名称、类型等)才能使代码在 Unix 上运行。或者获取一个提供 windows.h 的 Windows 兼容包 - 这样的东西曾经存在,但我已经十年多没有使用过了。 - Jonathan Leffler
8
简单的原因:Linux 不是 Windows。 - too honest for this site
3
@Olaf,那完全没有意义。 "获取编译器错误" 是尝试“编译”的结果,因此是“编译”。 windows.h 包含 Windows API 的头文件,因此如果 OP 正在尝试编译使用 windows.h 的程序,则仍在使用 Windows API,因此该问题与 Windows API 有关;可能没有明确指定,但它确实存在。 - smac89
显示剩余5条评论
1个回答

16
问题在于你的代码使用了windows.h头文件来获取仅适用于Windows的函数声明。由于Linux的工具链安装(例如GCC)默认只包含编译Linux所需的文件,因此这个文件通常不存在于Linux上。
你有几个选择:
1. 按照 Ed Heal的suggested建议,将代码移植到Linux。这意味着您需要删除包含windows.h的部分,并使用其Linux等效函数替换所有使用Windows API的函数调用。这将使您的源代码仅在Linux上工作,除非您可以将与操作系统相关的调用重构为平台无关的代码。需要注意的是:除非您要处理的程序非常简单,否则这不是一项容易的任务。并不是每个Windows API函数都有Linux的等效函数。 2. 为您的构建系统安装Windows工具链,其中应包括windows.h,并进行cross-compile编译您的代码。这将产生一个不能在Linux上运行但可以在Windows上运行的二进制文件。 3. 在这两种选项之间的折衷方法是实际上做两者,并使用conditional compilation允许您选择性地编译成另一个目标。

4
关于第二点:几乎可以肯定生成的二进制文件 可以 在Linux上运行,这要感谢 wine - 实际上,我经常半开玩笑地说Win32可执行文件是唯一可以在几乎任何Linux发行版上无需修改就可靠运行的二进制文件。=) - Matteo Italia
@MatteoItalia 你说得对,但这超出了这个问题的范围,所以我没有提及。楼主显然对这个领域还很新,所以我想避免用Wine让事情变得更复杂。 - skrrgwasme
有关如何进行交叉编译的更多细节可以提供吗? - M. Volf
@M.Volf,通过谷歌搜索“Linux交叉编译Windows”将会给你提供大量资源。我已经有一段时间没有这样做了,因此我能给你的具体建议可能已经过时。不过最好从mingw软件包开始着手。 - skrrgwasme

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接