第二章:Vscode gcc 如何编译winsock.h服务器代码

先说一句,使用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;
}

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

我们的目的是让上面代码,跑起来.

可能是一件简单的事,但是对于我来说太难了.

首先我们看下我的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"
        }
    ]
}

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

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"
}

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

这样的设置编译普通的程序是没问题,但是如果我们要编译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文件的在网上下载.

 

 

 

 

 

 

 

 

 

 

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值