MinGW编译Winsock2 C++代码报undefined reference错误如何解决
报错原因
- 代码中写的
#pragma comment(lib, "Ws2_32.lib")是微软MSVC编译器的专属编译指示,MinGW的g++编译器不支持该语法,无法自动完成winsock库的链接。 - 你调整后的编译指令链接顺序错误:gcc的链接器是按照从左到右的顺序解析符号依赖,依赖库必须放在依赖它的源文件/目标文件之后,你将
-lws2_32放在proxy.cpp前面,导致链接器在处理源文件之前就加载了库,无法匹配源文件中未定义的winsock相关符号。
修复方法
1. 修正编译指令
调整 -lws2_32 的位置,放到整个编译指令的最后,示例如下:
g++ -std=c++17 -Wall -Wextra -g "C:\Users\Martin F Lundgren\tdts06_lab\Lab2\proxy.cpp" -o "C:\Users\Martin F Lundgren\tdts06_lab\Lab2\proxy.exe" -lws2_32
如果是使用VSCode的C/C++插件自动构建,需要修改对应的 .vscode/tasks.json 配置,在参数列表的末尾添加 -lws2_32,参考配置片段:
{ "tasks": [ { "type": "cppbuild", "label": "C/C++: g++.exe 生成活动文件", "command": "C:\\msys64\\mingw64\\bin\\g++.exe", "args": [ "-fdiagnostics-color=always", "-g", "${file}", "-o", "${fileDirname}\\${fileBasenameNoExtension}.exe", "-lws2_32" ], "options": { "cwd": "${fileDirname}" }, "problemMatcher": [ "$gcc" ], "group": { "kind": "build", "isDefault": true } } ], "version": "2.0.0" }
2. 额外代码问题修复
你的代码存在逻辑错误会导致运行异常,可一并修正:
recv函数传参错误:你当前用监听socketserver_socket收数据,应该用accept返回的和浏览器建立连接的web_socket收数据,修改为:
recv(web_socket, browser_message, sizeof(browser_message), 0);
is_message函数判断逻辑不合理:直接判断数组第55位为'G'的误判率极高,建议改为判断请求行首是不是GET请求:
bool is_message(char mess[4096]) { // GET请求前四个字符为'G'、'E'、'T'、空格 return strncmp(mess, "GET ", 4) == 0; }
内容的提问来源于stack exchange,提问作者Martin F Lundgren
相关产品推荐
相关产品推荐

