• 刷C Primer Plus 第一步配置编程环境-使用VSCode 和 Remote


    背景信息:

      笔者第一次接触C语言是在大一学校开设的C语言程序设计课上,使用教材是国内高校老师编著的。

      Windows 系统,IDE 是 Microsoft Visual C++ 6.0,简称 VC6.0,是微软于1998年推出的一款 C++ 编译器。

      当时,没学习过计算机科学导论,计算机组成原理,也不知道 Linux 为何物。就这样期末考了 80+

    现在回炉重造!

      Windows 系统下使用 WSL 和 VSCode 调试 C/C++ 代码,这是折中方案。

      WSL(Windows Subsystem for Linux)是一个在Windows 10上能够运行原生Linux二进制可执行文件(ELF格式)的兼容层。

      它是由Microsoft与Canonical公司合作开发,其目标是使纯正的Ubuntu 14.04 "Trusty Tahr"映像能下载和解压到用户的本地计算机,并且映像内的工具和实用工具能在此子系统上原生运行。

    必备知识:

    Linux下gcc 编译C语言
     
    1.创建一个.C文件

    vi/vim  hello.c
    

    2.编译 hello.c文件,生成可执行文件

    gcc hello.c
    

     3.执行文件,在默认情况下产生的可执行程序名为 a.out

    ./a.out
    

     4.通常可以通过 gcc 的“-o”选项来指定自己的可执行程序名称。

    gcc -o hi hello.c
    

      生成可执行程序名为 hi

    ./hi
    

    5.使用gcc的“-c”标记来编译支持库代码(对多个文件进行编译)

    gcc -c hello.c
    

     输出结果为一个名为 hello.o 的文件
     


     Windows 10下安装WSL官方教程:https://docs.microsoft.com/zh-cn/windows/wsl/install-win10

    编辑器有两种方案:

    1. Vim 或 Emacs
    2. Visual Studio Code 官方教程:https://code.visualstudio.com/

    接下来在 VSCode 安装必备插件:

    1. Remote - WSL
    2. C/C++

    注意:点击 VSCode 左下角的 WSL:Ubuntu,选择 Remote-WSL:Reopen Folder in WSL

    使用 VSCode 编辑代码 与远程连接WSL:Ubuntu,在 Linux 下 gcc 编译 和 gdb 调试

     坑1:VSCode 是用来编辑代码,一定要保持在远程连接状态。

    理清思路,不要在本地新建文件夹保存代码,要完全按照 Linux 操作习惯

    $ mkdir chapter_03  

    确保 gcc 和 gdb 安装成功

    ~$ whereis gcc
    gcc: /usr/bin/gcc
    ~$ whereis gdb gdb: /usr/bin/gdb

     笔者第一次配置方案,不推荐,会有很多意想不到的报错,焦头烂额,根本没法专心写代码

    下面是第一次使用 VSCode 中 C/C++ 编译插件需要配置的文件,launch.json

    "version""0.2.0",
        "configurations": [
            {
                "name""(gdb) 启动",
                "type""cppdbg",
                "request""launch",
                "program""${workspaceFolder}/a.out",
                "args": [],
                "stopAtEntry"false,
                "cwd""${workspaceFolder}",
                "environment": [],
                "externalConsole"false,
                "MIMode""gdb",
                "setupCommands": [
                    {
                        "description""为 gdb 启用整齐打印",
                        "text""-enable-pretty-printing",
                        "ignoreFailures"true
                    }
                ]
            }
        ]

     坑2,使用 VSCode 编辑,在终端 gcc 编译,报错

    $ cd chapter_03
    $ ls
    frist.c
    $ gcc frist.c /usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o: in function `_start': (.text+0x24): undefined reference to `main' collect2: error: ld returned 1 exit status

     源文件如下:

    #include<stdio.h>
    
    int main(void){
        printf("test gcc...");
        return 0;
    }

     解决方案:

    $ gcc -Wall -g -c frist.c 
    $ gcc -Wall -g frist.o -o frist
    $ ./frist 
    test gcc...

    进一步学习 gcc 参数

    gcc 是 GNU 的 c 编译器,gcc 在执行编译工作的时候,总共需要4步:

    1. 预处理,生成 .i 的文件                                           [预处理器cpp]
    2. 将预处理后的文件转换成汇编语言, 生成文件 .s  [编译器egcs]
    3. 有汇编变为目标代码(机器代码) 生成 .o 的文件   [汇编器as]
    4. 连接目标代码, 生成可执行程序                           [链接器ld]
    -g  // 只是编译器,在编译的时候,产生调试信息。
    -c  // 只激活预处理,编译,和汇编,也就是只把程序做成obj文件

     


     接“第一次使用 VSCode 中 C/C++ 编译插件需要配置的文件”,更新配置文件,

    达到 VSCode 编辑,Ctrl + Shift + B 编译,Ctrl + F5 调试 的效果

    首先,打开WSL,Ubuntu

    出现的首行欢迎语:Welcome to Ubuntu 20.04 LTS (GNU/Linux 4.4.0-18362-Microsoft x86_64)

     然后,输入如下示例命令:

    ~$ cd c_primer_plus/
    ~/c_primer_plus$ ls
    chapter_02  chapter_03  chapter_04  chapter_05
    ~/c_primer_plus$ mkdir chapter_06
    ~/c_primer_plus$ cd chapter_06
    ~/c_primer_plus/chapter_06$ mkdir Demo
    ~/c_primer_plus/chapter_06$ mkdir Practise
    ~/c_primer_plus/chapter_06$ ls
    Demo  Practise

     首次用 VSCode 编辑,示例

     然后,先点击最下面 Configure Default Build Task

    然后,选择第一个

    就有如下代码,无需改动

    然后,Ctrl + Shift + B

    解放双手吧,接下来就是 Ctrl + F5 调试,自然是不行滴,先简单配置一下

    重点来了,选择最下面的配置

    留意此处的修改,WorkSpaceFolder 后新增 Demo,

    再根据编译后生成的文件后缀不同,添加 a.out,或 fileBasenameNoExtension

    再 Ctrl + F5,调试,大功告成!

    受此启发:https://blog.csdn.net/Hyz8970/article/details/101627753

  • 相关阅读:
    点击事件
    php if语句判定my查询是否为空
    php if语句判定ms查询是否为空
    thinkphp 原生sql使用分页类
    从JAVA客户端访问Redis示例(入门)
    Log4j日志级别
    网页正文抽取(包含提取图片)
    网络爬虫基本原理
    Java中替换HTML标签的方法代码
    Java/Js下使用正则表达式匹配嵌套Html标签
  • 原文地址:https://www.cnblogs.com/yiweshen/p/12788123.html
Copyright © 2020-2023  润新知