C语言 - WSAStartup@8的未定义引用问题

19

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

}

它是使用GNU GCC编译的,希望这有所帮助。 - Paulo
@HocineDJEMAI OP注意到了他的错误,但只进行了部分编辑。 - Weather Vane
我刚刚测试了你的代码,没有出现你提到的链接器错误。 - HDJEMAI
我忘记添加库ws2_32.lib,现在出现了错误“无法找到-lws2_32.lib”。 - Paulo
搞定了,谢谢大家的帮助。 - Paulo
显示剩余6条评论
5个回答

43

当代码被加载后,链接器会寻找依赖项。如果在符号所需的源文件出现之后,在构建过程中出现了库,则不会使用任何符号,并且稍后当它们在源文件中出现时将无法解析。将你要链接的winsock库-lws2_32放置在源文件和目标文件之后。

gcc prog.c -o prog -lws2_32

请问,在Qt Creator中源文件和目标文件应该放在哪里?我想链接这个库,因为我遇到了同样的问题,但是我的环境不同。 - Ivan Silkin
它们不在QT Creator中,而是由项目引用。如果您在QT Creator源列表中单击文件,您将找到物理位置。 - 4pie0

3

针对使用Windows上的Codeblocks的用户,以下是2019年的更新:

首先,在菜单栏中点击“设置”,然后选择“编译器”,接着切换到标签页“链接器设置”。在这里,点击“添加”,打开文件浏览器,进入C:/目录,并在搜索栏中输入“ws2_32”。会出现一个文件:“libws2_32.a”。通过点击“打开”将其添加到左侧的框中,然后点击“确定”。现在从你的代码中移除#PRAGMA行并尝试编译,一切应该正常工作。


3
你可能需要检查你的编译器选项,将-lws2_32添加到连接时添加链接器选项中。我使用TDM-GCC,在此之后运行良好。

2

1
您的源代码中使用了非常特定的(对于微软编译器而言)#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 ...

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接