16

我正在使用 Code::Blocks、MinGW 和 Windows。我试图初始化winsock,以便我可以处理一个项目。我不断收到错误Undefined Reference to WSAStartup@8有人知道如何解决这个问题吗?

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

#pragma comment(lib,"ws2_32.lib")

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

    output=WSAStartup(MAKEWORD(2,2),&wsa);
    if(output != 0) {
        printf("Startup failed %d\n", output);
        return 1;
    } else {
        printf("Initialized");
        return 0;
    }

}
4

5 回答 5

38

链接器在加载代码后查找依赖项。如果库在需要符号之前出现在构建过程中,因为源文件在此之后出现,则没有使用任何符号,然后当它们出现在源文件中时,它们将无法解析。将链接的 winsock 库-lws2_32放在源文件和目标文件之后。

gcc prog.c -o prog -lws2_32
于 2015-12-20T19:46:43.120 回答
2

我做了另一种方式,我找到了包含编译器无法链接到的函数的库,然后我添加到编译器的链接器。几乎所有的库都在 MINGW 的 lib 文件夹中(通常是 C:/MinGW/lib);像这样这些是我在使用 Dlib 遇到一些错误时添加的库, 或者您可以执行此指令以获取自动 regconite 缺失的库。在 Code::Blocks 中构建 wxWidgets 程序

于 2016-08-10T02:05:48.783 回答
1

在 Windows 上使用 Codeblocks 的用户的 2019 年更新:

首先,在菜单栏上,单击设置,然后单击编译器,然后切换到显示“链接器设置”的选项卡。从这里,单击添加,打开文件资源管理器,转到 C:/ 目录,然后在搜索栏中键入“ws2_32”。应显示一个文件:“libws2_32.a”。通过单击打开添加此文件,然后单击确定,(文件现在应该出现在左侧的框中),然后再次确定。现在从您的代码中删除#PRAGMA 行并尝试编译,事情应该可以正常工作。

于 2019-11-22T19:29:18.297 回答
1

你可能应该检查你的compiler options,添加-lws2_32add linker options when linking. 我使用 TDM-GCC,之后效果很好。

于 2017-04-24T02:08:11.630 回答
1

您的源代码显示您使用了非常具体的(对于 Microsoft 的编译器)#pragma comment(lib,"ws2_32.lib")语句。这有两个问题:

  1. 此编译指示在 GCC(即 MinGW 编译器)中无效,因此在编译和链接时都被忽略。
  2. 在 MinGW 中,(与大多数(也许所有?)其他平台上的 GCC 约定相同),没有“ws2_32.lib”;库的正确名称(它是 ws2_32.dll 的导入库)是“libws2_32.a”。

要解决您的问题,您不得在源代码中依赖 MSVC 特定的编译指示;相反,您必须在链接命令行上正确指定库,(几乎)如 tinky_winky 所示:

gcc prog.c -o prog.exe [...other .c and .o files...] -lws2_32 ...

(并确保您指定的任何库都位于需要它们的目标文件或源文件之后)

于 2015-12-30T19:25:52.727 回答