繁体   English   中英

C 在 windows 中编程 sockets - winsock2.h 链接库?

[英]C Programming sockets in windows - winsock2.h linking libraries?

我正在尝试使用 C 构建一些 Windows 套接字代码。 我从以下基本代码开始初始化 WinSock:

#include <winsock2.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
    WSADATA wsa;
    SOCKET s;

    printf("\nInitialising Winsock...");
    if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
    {
        printf("Failed. Error Code : %d",WSAGetLastError());
        return 1;
    }

    printf("Initialised.\n");
};

当我运行代码时,会出现以下错误:

undefined reference to '__imp_WSAStartup'

一个快速的谷歌建议这与需要一个库链接有关 - ws2_32

我使用的是 Cygwin,但显然这是试图模仿 Windows 中的 POSIX 环境,因此 MinGW 更适合这种情况。 因此,我在 VSCode 中安装并更新了设置以使用它。

现在我的问题是,我不确定如何链接所需的库。 我是否在我的程序中通过添加一些代码来做到这一点? 我是否在某种单独的终端中进行操作?

这对我来说都是新的。

不推荐使用 Cygwin 作为编码环境。 请参阅使用 Cygwin 的利弊。)选择一个环境或另一个。 即在 Windows 或 Linux 中运行GCC ,但不能同时运行。 Code::BlocksGCC捆绑在一起,并且具有可用于 Windows 或 Linux 的版本。

是的,错误消息undefined reference to表明虽然 header 文件存在,但它引用的库不存在。 它需要使用Ws2_32.lib链接。

例如,如果使用 Code::Blocks IDE,链接库的说明在这里

或者,从命令行使用GCC

例如,如果我在 /home/newhall/lib/ 中有一个名为 libmine.so 的库,那么我将执行以下操作将其链接到我的程序中:

   $ gcc -o myprog myprog.c  -L/home/newhall/lib -lmine  //Linux

   C:\> gcc -o myprog myprog.c  -LC:\home\newhall\lib -lmine  //Windows

...更多关于 gcc 命令行的信息

将代码链接到.exe文件的行需要在.o.c文件之后包含-lws2_32 因此,在您的情况下,如果您的程序称为myprogram.c您将需要运行:

gcc -o myprogram.exe myprogram.c -lws2_32

或者,如果您在单独的步骤中编译和链接:

gcc -c -o myprogram.o myprogram.c
gcc -o myprogram.exe myprogram.o -lws2_32

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM