【嵌入式修炼之路】-Linux基础之常用工具

学益得线上课堂
从基础学习嵌入式
玩转智能硬件、斩获高薪offer

在正式开始嵌入式学习之前,我们有必要搞懂几个工具,比如编辑器vim、编译器gcc、调试器gdb、工程管理器Makefile,今天就来给大家介绍下vim和gcc,这两个搞不懂,代码都写不了。

vim

以前的版本叫做vi,两者在配置上略微有区别,操作系统默认都会安装vi,不一定安装vim,所有如果环境里面没有的可以现安装一下。

一个完整的流程

先演示下如何编写代码、编译代码、运行代码。

1、进入某个目录(不要在根目录下写代码,比如可以进入/home目录),打开一个文件:

vim hello.c

如果hello.c文件不存在,则创建并打开,如果hello.c文件存在,则直接打开。

2、通过快捷键‘a’或者‘i’,进入【插入模式】,写个简单的C代码。

#include <stdio.h>

int main()
{   
    printf("helloworld!\n");
    return 0;
}

3、按键‘ESC’退出插入模式,‘:’进入低行模式,‘wq’保存退出。

4、编译代码并运行。

#gcc hello.c -o hello
#./hello
helloworld

vim三种模式

命令模式

vim打开一个文件的时候,首先进入的是命令模式。命令模式下可以移动光标,可以通过快捷键做一些简单的操作。

  1. ‘x’:删除光标所在位置的字符;
  2. ‘5x’:删除光标所在位置往后5个字符(当然不一定是5);
  3. ‘dd’:剪切光标所在行;
  4. ‘5dd’:从光标所在行开始,一共剪切5行;
  5. ‘yy’:复制光标所在行;
  6. ‘5yy’:从光标所在行开始,复制5行;
  7. ‘p’:从光标所在行的下一行开始,粘贴刚才复制或者剪切的内容;
  8. ‘shift+g’:跳到最后一行;
  9. ‘gg’:回到第一行。

插入模式

插入模式就是可以写代码的模式。怎么进入插入模式,按键‘a’或者‘i’都可以,略微有点区别,大家可以同手体验一下。‘esc’退出插入模式,回到命令模式。

底行模式

怎么进入低行模式?第一种方式,冒号‘:’。这种方式最常见的用处就是保存退出:

  1. ‘w’:保存文件
  2. ‘q’:退出文件
  3. ‘wq’:保存退出
  4. ‘w!’:强制保存
  5. ‘q!’:强制退出
  6. ‘wq!‘:强制保存退出
  7. ’set nonu‘:去除行号
  8. ’set nu‘:添加行号

第二种方式,’/‘进入低行模式,这种方式一般用于搜索,在’/'的后面跟上要搜索的字符串。

vim的快捷方式很多,如果能熟练的使用vim快捷方式,写代码的效率可不比vs差。vim也有很多插件,比如它也可以像vs一样自动补全。这里就不做赘述了。

gcc

gcc是Linux里面的C语言编译器。这篇文章主要给大家分享gcc的编译步骤、常用的参数,以及动态库和静态库的制作。

编译步骤

分成四步,预处理、编译、汇编、链接。

预处理

gcc -E hello.c -o hello.i #处理所有以#开头的代码,比如头文件、条件编译、宏定义

编译

gcc -S hello.i -o hello.s #语法检查,把文本文件变成汇编文件

汇编

gcc -C hello.s -o hello.o #把汇编文件变成二进制文件

链接

gcc hello.o -o hello  #链接最终的二进制文件需要用到的其他文件,比如库文件

常用参数

-I:如果包含的头文件不在系统指定目录或者当前目录,编译的时候需要指定头文件路径。

gcc hello.c -o hello -I .. #去上一层目录寻找头文件

-L:如果链接的库文件不在系统指定目录(一般/usr/lib或者/lib),编译的时候需要指定库的路径。

gcc hello.c -o hello -L .. #程序中需要用到的链接库在上一层目录

-static:静态编译。所谓静态编译,就是把程序需要用到的库文件和程序本身编译到一起,形成一个文件,这样生成的文件比较大,但是运行的时候,就算操作系统没有安装需要的库,也可以运行。编译的时候,默认采用动态编译。

gcc hello.c -o hello -static #静态编译,文件比较大

动态库和静态库

首先要搞懂什么静态编译和动态编译。比如我们写的hello.c程序,里面用到了printf函数,printf函数已经在C库里面实现,所以可以这么理解:

在这里插入图片描述

代码由两部分组成,一个是我们写的hello.c,还有一个是别人实现好的C库。

如果是动态编译(默认就是),gcc只编译hello.c,并且把C库的位置信息放在最终的hello文件中,这样得到的文件比较小。但是运行的时候,需要你的环境中安装了C库才行,因为要根据hello文件中的位置信息找到C库才能运行。

在这里插入图片描述

如果是静态编译,gcc会把hello.c和C库一起编译,形成一个文件,这样得到的文件比较大。好处是就算运行的环境中没有安装C库,也不影响,因为二进制文件本身已经包含了C库。

在这里插入图片描述
动态编译最后一步需要链接动态库,静态编译最后一步需要链接静态库。那么如何制作动态库和静态库?非常实用的技巧,尤其在公司和公司的合作中,别人给你提供的往往不是源码,而是经过加工处理的库文件。

先来写三个文件

f1.c

#include <stdio.h>

void f1()
{
    printf("this is f1...\n");
}

f2.c

#include <stdio.h>

void f2()
{
    printf("this is f2...\n");
}

main.c

#include <stdio.h>

void f1();
void f2();

int main()
{
    f1();
    f2();
    return 0;
}

静态库制作

gcc -c f1.c f2.c  #会自动生成f1.o和f2.o
ar -crv libx.a f1.o f2.o   #库的名字 lib开头,.a结尾,中间是库的名字
gcc main.c -o main -static -L . -l x  #-L表示库存放的位置,-l表示库的名字

动态库制作

gcc -fPIC -shared -o libxx.so f1.c f2.c  #生成二进制的动态库

gcc main.c -o main -L . -l xx    #路径和库的名字

运行之前,需要把库文件拷贝到/usr/lib(Redhat)目录下,因为运行的时候,系统默认去该目录下找库文件

cp libxx.so /usr/lib

./main

动态库和静态库对于初学者理解比较困难,但是gcc的基本用法一定要理解。可以等到C语言学完后再回来看,可能就会有不一样的收获。

更多视频、文章、嵌入式学习资源,微信关注公众号 【学益得智能硬件】

在这里插入图片描述

©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页