学益得线上课堂
从基础学习嵌入式
玩转智能硬件、斩获高薪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打开一个文件的时候,首先进入的是命令模式。命令模式下可以移动光标,可以通过快捷键做一些简单的操作。
- ‘x’:删除光标所在位置的字符;
- ‘5x’:删除光标所在位置往后5个字符(当然不一定是5);
- ‘dd’:剪切光标所在行;
- ‘5dd’:从光标所在行开始,一共剪切5行;
- ‘yy’:复制光标所在行;
- ‘5yy’:从光标所在行开始,复制5行;
- ‘p’:从光标所在行的下一行开始,粘贴刚才复制或者剪切的内容;
- ‘shift+g’:跳到最后一行;
- ‘gg’:回到第一行。
插入模式
插入模式就是可以写代码的模式。怎么进入插入模式,按键‘a’或者‘i’都可以,略微有点区别,大家可以同手体验一下。‘esc’退出插入模式,回到命令模式。
底行模式
怎么进入低行模式?第一种方式,冒号‘:’。这种方式最常见的用处就是保存退出:
- ‘w’:保存文件
- ‘q’:退出文件
- ‘wq’:保存退出
- ‘w!’:强制保存
- ‘q!’:强制退出
- ‘wq!‘:强制保存退出
- ’set nonu‘:去除行号
- ’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语言学完后再回来看,可能就会有不一样的收获。
更多视频、文章、嵌入式学习资源,微信关注公众号 【学益得智能硬件】