【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

原文地址:https://www.cnblogs.com/pailang-lee/p/14354051.html