即使在 Linux 上安装了 mingw 包,gcc 也无法找到“windows.h、winsock2.h 和 ws2tcpip.h”头文件
Posted
技术标签:
【中文标题】即使在 Linux 上安装了 mingw 包,gcc 也无法找到“windows.h、winsock2.h 和 ws2tcpip.h”头文件【英文标题】:gcc unable to find "windows.h, winsock2.h and ws2tcpip.h" header files even after installing mingw package on Linux 【发布时间】:2020-05-29 07:27:35 【问题描述】:我正在尝试在 Linux 中使用 winsock2.h、windows.h 和 ws2tcpip.h 创建一个 c/c++ 程序。但我收到以下错误消息:
无法打开源文件“winsock2.h”C/C++(1696)
同样适用于 windows.h
无法打开源文件“windows.h”C/C++(1696)
我已经使用这个命令在我的系统上安装了 Mingw
mingw-w64-common mingw-w64-i686-dev mingw-w64-tools mingw-w64-x86-64-dev
我的程序
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#pragma comment(lib, "Ws2_32.lib")
int main() return 0;
VSC 版本 - 1.45.1
操作系统 - Debian
【问题讨论】:
@qrdl 但 mingw 包为 linux 提供了特定于 windows 的开发和运行时环境。 @ShubhamMishra 你有没有觉得被剥夺了使用 Linux 套接字 API :( ? @MohithReddy 我正在尝试创建一个在窗口服务器上运行的应用程序 @qrdl 你能详细说明一下吗 这可能会有所帮助:code.visualstudio.com/docs/cpp/… 【参考方案1】:问题似乎与“找不到头文件”有关。如果使用 gcc 包含自定义标头路径(或目录),您可以执行以下操作。
注意:我的意图不是使用 mingw 提供的带有 gcc 的标头;这只是为了演示目的。
dpkg -L mingw-w64-common
在我的系统上给出这样的输出。
/usr/share/mingw-w64/include/windows.h
/usr/share/mingw-w64/include/winsock2.h
/usr/share/mingw-w64/include/ws2tcpip.h
gcc -v test.c
在我的系统上给出这样的输出
#include "..." search starts here:
#include <...> search starts here:
/usr/lib/gcc/x86_64-linux-gnu/9/include
/usr/local/include
/usr/lib/gcc/x86_64-linux-gnu/9/include-fixed
/usr/include/x86_64-linux-gnu
/usr/include
所以很明显,标题或不在默认搜索路径中。在这种特殊情况下,您需要使用gcc -I/usr/share/mingw-w64/include
进行编译。您为工具链的编译器提供了类似的选项。但是你可能需要根据你的代码使用的库来处理链接错误。
【讨论】:
正如在其他地方已经提到的,要真正针对 Windows,您需要使用正确的工具链,例如x86_64-w64-mingw32-gcc,不仅仅是包含。 @DavidMacek 是的,看起来是这样,并且从 OP 的错误消息中,我们可以得出结论,他使用的是gcc
提供的 mingw,而不是 Linux。但即使在那种情况下,问题似乎与找不到头文件有关。据我所知,即使使用工具链的编译器,我们也包含带有选项 -I
的头目录,我将编辑我的帖子以朝这个方向进行项目,谢谢!
我认为我们不能得出这样的结论。在暗示 Debian 的 mingw-w64 GCC 配置不正确之前,我会三思(或更多)。
@DavidMacek 在这种情况下,OP 需要提供有关其环境设置的信息。从您对他的帖子的评论来看,OP 正在使用 Linux,并且没有适用于 Linux 的 Visual Studio IDE(除非它在 wine 上运行,我没有尝试过),所以很可能他正在使用 Visual Studio Code,并且 OP 在问题的底部。现在我真正的问题是,VSC 是否有一些插件来集成编译过程?
@Mohith 感谢您的帮助,但我收到了相同的错误消息,我认为这一切都是通过 VS 中的 C/C++ 配置默认设置的【参考方案2】:
消息格式cannot open source file "winsock2.h"C/C++(1696)
在我看来不像 GCC 所说的那样。
是否有可能在安装 MinGW-w64 时没有使用它的 GCC 编译器?
要让 MinGW-w64 正常工作,您需要将其作为工具链(编译器、链接器)。
【讨论】:
是gcc
以不同的方式报告“找不到标头”。但是链接here 说程序是用 gcc 编译的。
您是否在 (Debian) Linux 上使用 mingw-w64 编译器进行编译,然后尝试运行它?由于您基本上是针对另一个操作系统(Windows)进行交叉编译,因此这是完全有道理的。如果你真的想在 Linux 上运行 Windows 可执行文件,也许你应该看看 Wine。
我认为该描述一般指的是 GCC,而不是专门指 /usr/bin/gcc
。你试过这个吗? packages.debian.org/search?keywords=gcc-mingw-w64-x86-64
错误消息可能来自 VSCode(甚至可能不是来自构建)。
@BrechtSanders 我使用 /usr/bin/gcc 作为编译器路径,使用 gcc-x64 作为 IntelliSense 模式,但我遇到了同样的问题以上是关于即使在 Linux 上安装了 mingw 包,gcc 也无法找到“windows.h、winsock2.h 和 ws2tcpip.h”头文件的主要内容,如果未能解决你的问题,请参考以下文章
使用 Mingw 在 Windows 上安装 Linux 库