• 【Linux学习】—第8章linux编程


    一、gcc的学习

    1. GCC编译的四个阶段

      1、预处理:将代码中的代码中的头文件,宏定义宏选择等进行展开及替换。 gcc -E

      2、编译 :产生汇编文件 。gcc -S

      3、汇编 :将汇编文件编译为目标文件。 gcc -c

      4、链接 :产生可执行文件

    2.例子

    root@pailanglee-virtual-machine:/home/pailanglee# vi hello.c
    root@pailanglee-virtual-machine:/home/pailanglee# cat hello.c
    #include<stdio.h>
    main ()
    {
       printf("Hello World
    ");
    }
    
    root@pailanglee-virtual-machine:/home/pailanglee# gcc hello.c
    hello.c:2:1: warning: return type defaults to ‘int’ [-Wimplicit-int]
        2 | main ()
          | ^~~~
    root@pailanglee-virtual-machine:/home/pailanglee# cat >> hello.c
    root@pailanglee-virtual-machine:/home/pailanglee# vi hello.c
    root@pailanglee-virtual-machine:/home/pailanglee# gcc hello.c
    root@pailanglee-virtual-machine:/home/pailanglee# ./a.out
    Hello World
    

    3.常用的gcc参数

    • gcc -c hello.c

      image-20201115095149665

      root@pailanglee-virtual-machine:/home/pailanglee# gcc -c hello.c
      root@pailanglee-virtual-machine:/home/pailanglee# ls
      公共的  模板  视频  图片  文档  下载  音乐  桌面  a.out  hello.c  hello.o  snap  test.c
      root@pailanglee-virtual-machine:/home/pailanglee# 
      
    • gcc -o hello hello.c

      指定hello编译出的文件名位hello

      root@pailanglee-virtual-machine:/home/pailanglee# gcc -o hello hello.c
      root@pailanglee-virtual-machine:/home/pailanglee# ls
      公共的  模板  视频  图片  文档  下载  音乐  桌面  a.out  hello  hello.c  hello.o  snap  test.c
      root@pailanglee-virtual-machine:/home/pailanglee# 
      
    • gcc -o hello hello.c -Wall

      root@pailanglee-virtual-machine:/home/pailanglee# gcc -o hello hello.c -wall
      gcc: error: unrecognized command line option ‘-wall’; did you mean ‘-Wall’?
      root@pailanglee-virtual-machine:/home/pailanglee# gcc -o hello hello.c -Wall
      root@pailanglee-virtual-machine:/home/pailanglee# 
      
    • gcc -S hello.c

      仅激活预处理和汇编

      root@pailanglee-virtual-machine:/home/pailanglee# gcc -S hello.c
      root@pailanglee-virtual-machine:/home/pailanglee# ls
      公共的  模板  视频  图片  文档  下载  音乐  桌面  a.out  hello  hello.c  hello.o  hello.s  snap  test.c
      root@pailanglee-virtual-machine:/home/pailanglee# 
      
    • gcc -E hello.c >hello.pre

      只有激活预处理

      root@pailanglee-virtual-machine:/home/pailanglee# gcc -E hello.c >hello.pre
      root@pailanglee-virtual-machine:/home/pailanglee# ls 
      公共的  模板  视频  图片  文档  下载  音乐  桌面  a.out  hello  hello.c  hello.o  hello.pre  hello.s  snap  test.c
      root@pailanglee-virtual-machine:/home/pailanglee# 
      

    二、gbd调试

    1. 什么是gbd

    gbd是一个调试代码的调试器,可以用来观察程序的内部结构内存堆栈的情况

    2.gbd的功能

    • 监视程序中的变量的值
    • 设置程序的断点
    • 逐行执行代码

    3.用法

    三、vim的安装

    安装vim

    安装

    pailanglee@pailanglee-virtual-machine:~$ sudo apt-get install vim-nox
    [sudo] pailanglee 的密码: 
    E: 无法获得锁 /var/lib/dpkg/lock-frontend。锁正由进程 4451(unattended-upgr)持有
    N: 请注意,直接移除锁文件不一定是合适的解决方案,且可能损坏您的系统。
    E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend),是否有其他进程正占用它?
    pailanglee@pailanglee-virtual-machine:~$ yum -y install vim*
    
    Command 'yum' not found, did you mean:
    
      command 'gum' from snap gum (0.8.0)
      command 'zum' from deb perforate (1.2-5.1)
      command 'num' from deb quickcal (2.4-1)
      command 'uum' from deb freewnn-jserver (1.1.1~a021+cvs20130302-7build1)
      command 'sum' from deb coreutils (8.30-3ubuntu2)
    
    See 'snap info <snapname>' for additional versions.
    
    pailanglee@pailanglee-virtual-machine:~$ 
    
    ![image-20201115125147138](https://img2020.cnblogs.com/blog/1778034/202101/1778034-20210131210958708-2039612720.png)
    
    ```shell
    sudo rm /var/cache/apt/archives/lock  
    sudo rm /var/lib/dpkg/lock
    ```
    
    # 四、make的使用
    
    ## 1.基本功能
    
    通过makefile文件来描述源程序之间的关系
    
    
    
    
    
    
    root@pailanglee-virtual-machine:/home/pailanglee# ls
    公共的  视频  文档  音乐  a.out  hello.c  hello.pre  snap
    模板    图片  下载  桌面  hello  hello.o  hello.s    test.c
    root@pailanglee-virtual-machine:/home/pailanglee# vi cos_value.c
    root@pailanglee-virtual-machine:/home/pailanglee# ls
    公共的  视频  文档  音乐  a.out        hello    hello.o    hello.s  test.c
    模板    图片  下载  桌面  cos_value.c  hello.c  hello.pre  snap
    root@pailanglee-virtual-machine:/home/pailanglee# vi haha.c
    root@pailanglee-virtual-machine:/home/pailanglee# vi main.c
    root@pailanglee-virtual-machine:/home/pailanglee# vi sin_value.c
    root@pailanglee-virtual-machine:/home/pailanglee# ls
    公共的  图片  音乐   cos_value.c  hello.c    hello.s      snap
    模板    文档  桌面   haha.c       hello.o    main.c       test.c
    视频    下载  a.out  hello        hello.pre  sin_value.c
    
    root@pailanglee-virtual-machine:/home/pailanglee# ls
    公共的  视频  文档  音乐  a.out  hello.c  hello.pre  snap
    模板    图片  下载  桌面  hello  hello.o  hello.s    test.c
    root@pailanglee-virtual-machine:/home/pailanglee# vi cos_value.c
    root@pailanglee-virtual-machine:/home/pailanglee# ls
    公共的  视频  文档  音乐  a.out        hello    hello.o    hello.s  test.c
    模板    图片  下载  桌面  cos_value.c  hello.c  hello.pre  snap
    root@pailanglee-virtual-machine:/home/pailanglee# vi haha.c
    root@pailanglee-virtual-machine:/home/pailanglee# vi main.c
    root@pailanglee-virtual-machine:/home/pailanglee# vi sin_value.c
    root@pailanglee-virtual-machine:/home/pailanglee# ls
    公共的  图片  音乐   cos_value.c  hello.c    hello.s      snap
    模板    文档  桌面   haha.c       hello.o    main.c       test.c
    视频    下载  a.out  hello        hello.pre  sin_value.c
    root@pailanglee-virtual-machine:/home/pailanglee# vi makefile
    root@pailanglee-virtual-machine:/home/pailanglee# cat makefile
    cat: makefile: 没有那个文件或目录
    root@pailanglee-virtual-machine:/home/pailanglee# vi makefile
    root@pailanglee-virtual-machine:/home/pailanglee# make main
    cc    -c -o main.o main.c
    main.c: In function ‘main’:
    main.c:9:12: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[15]’ [-Wformat=]
        9 |  scanf  ("%s", &name );
          |           ~^   ~~~~~
          |            |   |
          |            |   char (*)[15]
          |            char *
    main.c:12:2: warning: implicit declaration of function ‘haha’ [-Wimplicit-function-declaration]
       12 |  haha( name );
          |  ^~~~
    main.c:13:2: warning: implicit declaration of function ‘sin_value’ [-Wimplicit-function-declaration]
       13 |  sin_value( angle );
          |  ^~~~~~~~~
    main.c:14:2: warning: implicit declaration of function ‘cos_value’ [-Wimplicit-function-declaration]
       14 |  cos_value( angle );
          |  ^~~~~~~~~
    cc    -c -o haha.o haha.c
    cc    -c -o sin_value.o sin_value.c
    cc    -c -o cos_value.o cos_value.c
    gcc -o main main.o haha.o sin_value.o cos_value.o -lm
    root@pailanglee-virtual-machine:/home/pailanglee# ls
    公共的  视频  文档  音乐  a.out        cos_value.o  haha.o  hello.c  hello.pre  main    main.o    sin_value.c  snap
    模板    图片  下载  桌面  cos_value.c  haha.c       hello   hello.o  hello.s    main.c  makefile  sin_value.o  test.c
    root@pailanglee-virtual-machine:/home/pailanglee# make clean
    rm -f main main.o haha.o sin_value.o cos_value.o
    root@pailanglee-virtual-machine:/home/pailanglee# ls
    公共的  模板  视频  图片  文档  下载  音乐  桌面  a.out  cos_value.c  haha.c  hello  hello.c  hello.o  hello.pre  hello.s  main.c  makefile  sin_value.c  snap  test.c
    root@pailanglee-virtual-machine:/home/pailanglee# 
    

    image-20201115132130809

    image-20201115132155702

    2. makefile 的基本语法与变量

    • # : 表示注解
    • 需要在命令行 (例如 gcc 这个编译器指令) 的第一个字符
    • target与相依文件也就是目标文件之间用冒号隔开

    image-20201115150444665

    3.用宏简化

    [root@study ~]# vi makefile

    LIBS = -lm

    OBJS = main.o haha.o sin_value.o cos_value.o

    main: ${OBJS}

    ​ gcc -o main ${OBJS} ${LIBS}

    clean:

    ​ rm -f main ${OBJS}

    • 引用宏时需要加 $ 符号

    • 宏名的长度超过1是要用圆括号()

      $(CL)

    • image-20201115151434337

    image-20201115151515904

  • 相关阅读:
    Xcode11 Developer Tool中没了Application Loader
    iOS
    iOS
    UIView与CALayer的区别,很详细(基础教学拓展)转
    使pre的内容自动换行(转)小知识
    requirejs:模块加载(require)及定义(define)时的路径理解
    JS国际化网站中英文切换(理论支持所有语言)应用于h5版APP
    Tomcat8 配置APR模式
    Mongodb安装
    SecureCRT配色方案
  • 原文地址:https://www.cnblogs.com/pailang-lee/p/14354051.html
Copyright © 2020-2023  润新知