Clion使用Socket报错undefined reference to `__imp_WSAStartup‘(解决办法)

19 篇文章 0 订阅
7 篇文章 0 订阅

根据哔哩哔哩上的视频,使用Clion写一个Socket的服务器,但是当写完之后发现并不能运行,程序报错。

====================[ 构建 | MyHttpd | Debug ]====================================
"D:\Program Files\JetBrains\CLion 2022.2\bin\cmake\win\bin\cmake.exe" --build C:\Users\MI\CodeSpace\ClionCodeProjects\MyHttpd\cmake-build-debug --target MyHttpd -j 6
[1/1] Linking CXX executable MyHttpd.exe
FAILED: MyHttpd.exe 
cmd.exe /C "cd . && "D:\Program Files\JetBrains\CLion 2022.2\bin\mingw\bin\g++.exe" -g  CMakeFiles/MyHttpd.dir/main.cpp.obj CMakeFiles/MyHttpd.dir/Httpd.cpp.obj -o MyHttpd.exe -Wl,--out-implib,libMyHttpd.dll.a -Wl,--major-image-version,0,--minor-image-version,0  -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 && cd ."
D:\Program Files\JetBrains\CLion 2022.2\bin\mingw\bin/ld.exe: CMakeFiles/MyHttpd.dir/Httpd.cpp.obj: in function `startup(unsigned short*)':
C:/Users/MI/CodeSpace/ClionCodeProjects/MyHttpd/Httpd.cpp:25: undefined reference to `__imp_WSAStartup'
D:\Program Files\JetBrains\CLion 2022.2\bin\mingw\bin/ld.exe: C:/Users/MI/CodeSpace/ClionCodeProjects/MyHttpd/Httpd.cpp:30: undefined reference to `__imp_socket'
D:\Program Files\JetBrains\CLion 2022.2\bin\mingw\bin/ld.exe: C:/Users/MI/CodeSpace/ClionCodeProjects/MyHttpd/Httpd.cpp:37: undefined reference to `__imp_setsockopt'
D:\Program Files\JetBrains\CLion 2022.2\bin\mingw\bin/ld.exe: C:/Users/MI/CodeSpace/ClionCodeProjects/MyHttpd/Httpd.cpp:47: undefined reference to `__imp_htons'
D:\Program Files\JetBrains\CLion 2022.2\bin\mingw\bin/ld.exe: C:/Users/MI/CodeSpace/ClionCodeProjects/MyHttpd/Httpd.cpp:48: undefined reference to `__imp_htonl'
D:\Program Files\JetBrains\CLion 2022.2\bin\mingw\bin/ld.exe: C:/Users/MI/CodeSpace/ClionCodeProjects/MyHttpd/Httpd.cpp:51: undefined reference to `__imp_bind'
D:\Program Files\JetBrains\CLion 2022.2\bin\mingw\bin/ld.exe: C:/Users/MI/CodeSpace/ClionCodeProjects/MyHttpd/Httpd.cpp:57: undefined reference to `__imp_getsockname'
D:\Program Files\JetBrains\CLion 2022.2\bin\mingw\bin/ld.exe: C:/Users/MI/CodeSpace/ClionCodeProjects/MyHttpd/Httpd.cpp:64: undefined reference to `__imp_listen'
collect2.exe: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.

在这里插入图片描述
这是我们的代码,

//
// Created by MI on 2022/11/2.
//
#include <cstdio>
#include <iostream>
//网络通信需要包含的头文件
#include <winsock2.h>

//手动加载的库文件
void error_die(const char *string);

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

using namespace std;

/*
实现网络的初始化
返回值:套接字 socket
参数 port:表示端口,如果*port的值是0.那么就自动分配端口,这样子写是为了向tinyhttpd服务器致敬
 端口在网络开发规范里面是一个无符号的短整型 unsigned short
 */
int startup(unsigned short *port) {
    //网络通信的初始化
    WSADATA data;
    int ret = WSAStartup(MAKEWORD(1, 1), &data);//1.1版本的协议
    if (ret) {//ret != 0
        error_die("WSAStartup");
    }
    //套接字的类型, 数据流,tcp协议
    int server_socket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (server_socket == SOCKET_ERROR) {
        //打印错误提示,并结束
        error_die("套接字失败了");
    }
    //设置端口复用
    int opt = 1;
    int res = setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR, (const char *) &opt, sizeof(opt));
    if (res == -1) {
        error_die("setsockopt");

    }

    //配置服务器网络地址
    struct sockaddr_in server_addr{};
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(*port);
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);

    //绑定套接字
    if (bind(server_socket, (struct sockaddr *) &server_addr, sizeof(server_addr)) < 0) {
        error_die("bind");
    }
    //动态分配端口
    int nameLen = sizeof(server_addr);
    if (*port == 0) {
        if (getsockname(server_socket, (struct sockaddr *) &server_addr, &nameLen) < 0) {
            error_die("getsockname");
        }
        *port = server_addr.sin_port;
    }

    //创建监听队列
    if (listen(server_socket, 5) < 0) {
        error_die("listen");
    }

    return server_socket;

}

void error_die(const char *string) {
    perror(string);
    exit(1);
}


int main() {
    unsigned short port = 0;

    int server_sock = startup(&port);

    cout << "Http server start,listener port:" << server_sock << endl;

    return 0;
}


可以看到我们添加了库文件和头文件

//网络通信需要包含的头文件
#include <winsock2.h>

//手动加载的库文件
#pragma comment(lib, "ws2_32.lib")

但是我们不能像B站视频教程的那样子直接运行,而是需要去CMakeLists.txt添加link_libraries(ws2_32)就可以了。

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值