先说一句,使用Code Runner无法采用以下办法.因为Code Runner运行后执行的指令是写好的 {gcc name.c -o name}
也许可以,但我不知道如何修改指令在后面加上一些参数,欢迎大佬评论.
开始进入正题:如何在vscode编译winsock.h服务器代码.
#include<stdio.h>
#include<stdlib.h>
#include<winsock.h>
#define N 500
int HightByte = 0,LowerByte = 1;
int main(){
char sendBuf[N],recBuf[N];
WORD wVersion = MAKEWORD(HightByte,LowerByte);//高位字节表示副版本,低位字节表示主版本
struct WSAData wsaData;
int error= WSAStartup(wVersion,&wsaData);
if(error!=0){
printf("启动套接字失败\n");
return 0;
}
if(LOBYTE(wsaData.wVersion)!=LowerByte||HIBYTE(wsaData.wHighVersion)!=HightByte){
WSACleanup();
return 0;
}
return 0;
}
我们的目的是让上面代码,跑起来.
可能是一件简单的事,但是对于我来说太难了.
首先我们看下我的launch.json和tasks.json设置看看是否与你们差不多一样.
launch.json如下
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "gcc.exe build and debug active file",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"miDebuggerPath": "F:\\MinGW\\bin\\gdb.exe",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "gcc.exe build active file"
}
]
}
tasks.json如下
{
"tasks": [
{
"type": "shell",
"label": "gcc.exe build active file",
"command": "F:\\MinGW\\bin\\gcc.exe",
"args": [
"-g",
"${file}",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"
],
"options": {
"env":{
"PYTHONIOENCODING": "UTF-8"
},
"cwd": "F:\\MinGW\\bin"
}
}
],
"version": "2.0.0"
}
这样的设置编译普通的程序是没问题,但是如果我们要编译winsocket的话,则会出现错误,(我本来想放照片,但是我不知道如何上传你们自己试试就知道啦)
在Vs中我们也会出现相同的错误,解决办法是在调用头文件下加入代码
#pragma comment(lib,"ws2_32.lib")或者在项目中设置.
但这招在VsCode中不适用
我询问了某群大佬得知,用gcc来编译的话需要的指令为
gcc Server.c -o Server -l ws2_32
那么方法就很清楚了,我们在tasks.json文件中的args属性中添加"-l","ws2_32"
我操作后就会发现另一个问题:cannot find -lws2_32(找不到-lws2_32.lib文件)
我百度了下gcc的-L,-l的指令意义得知-L的意思是设置链接库
-l参数就是用来指定程序要链接的库,-l参数紧接着就是库名
-L参数跟着的是库文件所在的目录名
则应该添加"L","/*path*/","l","ws2_32"如下
"args": [
"-g",
"${file}",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe",
"-L",
"F:\\lib",//这里是我的文件保存的路径
"-l",
"ws2_32"
],
没有ws2_32.lib的自己下一个,有C币的在CSDN下载就行没有的话,网上的网站也可以,不过要小心绑定软件.
下面是我额外的一些收获.
文件的目录在哪里?同样百度过后给出了ws2_32.dll文件的路径(通常在C:\Windows\System32)
那么ws2_32.lib的文件又在哪里?
我搜索了,整个电脑也没有找到,忽然想起,vs每次运行都会从某个服务器下载一堆dll文件,难道lib这些文件也需要我手动下?
与此同时我们还要明白dll与lib有什么区别?为什么系统自带了个同名同姓的文件,但是后缀不同?
这个问题可能看起来非常蠢,但我就是这么蠢的一个小白.
于是,我继续百度:详细请看这个大佬的教程
就看懂一句话:总之,lib是编译时用到的,dll是运行时用到的。如果要完成源代码的编译,只需要lib;如果要使动态链接的程序运行起来,只需要dll。
我们要编译winsock服务器的代码,是不是需要找到lib的文件就行了?
计算机没有ws2_32.lib文件的在网上下载.