【问题标题】:C - Undefined Reference to WSAStartup@8'C - 对 WSAStartup@8' 的未定义引用
【发布时间】:2016-03-26 21:15:03
【问题描述】:

我正在使用 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;
    }

}

【问题讨论】:

  • 你如何编译你的代码?
  • FWIW 编译并与 MSVC 链接。
  • 它是用 GNU GCC 编译的,希望能有所帮助
  • 变量Results没有在Printf语句中声明
  • @HocineDJEMAI OP 注意到了他的错误,但只对其进行了部分编辑。

标签: c mingw codeblocks winsock wsastartup


【解决方案1】:

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

gcc prog.c -o prog -lws2_32

【讨论】:

  • 对不起,源文件和对象文件在 Qt Creator 中的什么位置?为了能够链接这个库,因为我有同样的问题,但另一个环境
  • 它们不在 QT Creator中,而是被项目引用。如果您单击 QT Creator 源列表中的文件,您将找到物理位置。
【解决方案2】:

我做了另一种方式,我找到了包含编译器无法链接到的函数的库,然后我添加到编译器的链接器。几乎所有的库都在 MINGW 的 lib 文件夹中(通常是 C:/MinGW/lib);像这样These are libraries I add when I got some errors with Dlib 或者,您可以为 auto regconite 缺少库执行此指令。 Building a wxWidgets program in Code::Blocks

【讨论】:

    【解决方案3】:

    您的源代码显示您使用了非常具体的(对于 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 ...
    

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

    【讨论】:

      【解决方案4】:

      您可以查看您的compiler options,将-lws2_32 添加到add linker options when linking。 我使用 TDM-GCC,之后效果很好。

      【讨论】:

        【解决方案5】:

        2019 年更新适用于在 Windows 上使用代码块的用户:

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

        【讨论】:

          猜你喜欢
          • 2012-09-10
          • 1970-01-01
          • 2015-03-01
          • 1970-01-01
          • 2016-05-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多