min-GW gcc 无法链接 winsock2.h

问题描述 投票:0回答:1

我正在尝试使用 winsock2 库,我正在使用它从 open62541

编译教程服务器

我使用并出错的一些代码(来自合并构建的 open62541.c):

#include <winsock2.h>
#include <Windows.h>
#INCLUDE <ws2tcpip.h>

int main(){
   struct pollfd tmp_poll_fd;
   }

我正在使用 mingw 编译 open62541 服务器,并按照tutorial

gcc -std=c99 server.c open62541.c -lws2_32 -o server.exe

错误:

error: storage size of 'tmp_poll_fd' isn't known
     struct pollfd tmp_poll_fd;

其他错误也与 winsock2 库有关,例如

POLLWRNORM undeclared

我已经检查过 winsock2.h 就位了,

我也检查里面的winsock2.h包含

struct pollfd
POLLWRNORM

我已经尝试在 gcc 命令中进行一些更改,例如:

gcc -std=c99 server.c open62541.c -libws2_32 -o server.exe

有办法解决这个问题吗?

c c99 winsock2 open62541
1个回答
1
投票

免责声明:此答案是基于我本地安装的MinGW版本(8.1.0,由MinGW-W64项目构建),您的情况可能有所不同。

包含文件“winsock2.h”对目标Windows版本有保护:

#if (_WIN32_WINNT >= 0x0600)

/* ... */

typedef struct pollfd {

/* ... */

#endif /*(_WIN32_WINNT >= 0x0600)*/

_WIN32_WINNT
由“_mingw.h”设置为0x502,如果不通过其他方式更改它:

#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x502
#endif

根据 Microsoft 的文档,值 0x502 表示“Windows Server 2003”。如果您将宏设置为大于或等于 0x600(“Windows Vista”)的值,您的编译将成功:

#define _WIN32_WINNT 0x600

#include <winsock2.h>
#include <windows.h>
#include <ws2tcpip.h>

int main(void) {
    struct pollfd tmp_poll_fd;
}
© www.soinside.com 2019 - 2024. All rights reserved.