1.vim编辑器
基本语法:vim hello.c
如果此文件存在,直接进入;若不存在,先创建再进入。
vim有三个模式:命令模式、插入模式、低行模式。
-
命令模式:打开文件后就是命令模式 按shift+z+z退出。
在命令模式中的功能键:
x:删除单个字符
nx:删除自光标向下n行
dd:剪切一行
ndd:剪切自光标向下n行
yy:复制
nyy:复制自光标向下n行
p:粘贴
u: 撤销上一步操作
nG:跳到行号为n
G:跳到文件底部
…
在命令模式中,敲击键盘的动作被vim识别为命令而非输入字符。因此可输入的命令有限,还需要借助低行模式输入更多命令。 -
插入模式:在命令模式下,按i、s或a进入插入模式,按ESC回到命令模式。插入模式就是一个可编辑文本的模式。
在该模式中光标靠方向键控制,也可以配置为鼠标控制。 -
底行模式:按:进入底行模式(可能是这个模式下的命令都在最下面一行所以叫底行模式吧。。)
相关功能键:
w: 保存
q:退出
wq:保存退出
set nu:加上行号
set nonu:去掉行号
set nohl:去掉高亮
w filename:该功能我理解为 另存为,复制一份该文件改个名字。
若是直接敲q退出的话,编译器会询问保存,所以我一般想不保存退出时敲 q!,“!”表强制。
2.gcc工具链
GCC 即 GNU C Compiler 。
GCC 已经不仅仅能支持 C 语言;还支持 Ada 语言、C++ 语言、Java 语言、Objective C 语言、Pascal 语言、COBOL语言,以及支持函数式编程和逻辑编程的 Mercury 语言,等等。 GCC 是 GNU Compiler Collection 也即是 GNU 编译器家族的意思。
我理解为不是一个单独的程序,而是多个程序的结合,所以叫工具链。
编译指令
例:gcc test.c -o test
会产生一个可执行的文件test
若直接 gcc test.c ,会生成默认文件a.out文件
-o:后面表示输出文件的名称选项-o用于指定要生成的结果文件,后面跟的就是结果文件名字。o是output的意思,不是目标的意思。
结果文件可能是预处理文件、汇编文件、目标文件或者最终可执行文件。
不过a.out是默认输出的文件,为了方便区分识别各个文件,还是在输出时给各个文件命名。
输入:./test即可运行该文件
以上指令编译的过程可以分为四个步骤:预处理、编译、汇编、连接。、
-
预处理: gcc -E test.c -o test.i
或 gcc -E test.c
(-E :只进行预编译,不做其他处理)
不过这两种编译方式有区别:
第一种会在目录中生成目标文件test.i
第二种不会生成文件,只会在命令行下方显示预编译的内容
预处理是处理以#开头的代码,例如
头文件:(#include<stdio.h>) 将其展开
宏定义:#define N 5 替换
条件编译:if 0/ if 1 -
编译:gcc -S test.i -o test.s
(-S :只是编译不汇编,生成汇编代码)
若省去后面的 -o test.s,一样可以生成test.s文件,与预处理有区别。
此步骤是把程序变为汇编语言 -
汇编:gcc -c -test.s -o test.o
(-c :只是编译不链接,生成目标文件“.o”)
若省去后面的 -o test.o,一样可以生成test.s文件与预处理 有区别,与编译一致。
此步骤是将程序变为二进制文件。
连接 :gcc test.o -o test
到此文件编译完成,test为一个可执行文件。
(-o file :把输出文件输出到file里)
这四步是上面 gcc test.c -o test 的剖析,一般都是一步到位,这四步感觉没有什么实用的地方。可执行文件test用vim打开后是一串乱码,方便保护源码机密。
另:-g :在可执行程序中包含标准调试信息
库的使用
从逻辑功能上看。程序的主体是由一系列函数组成的,所以编写程序的主要工作之一就是实现函数。为了降低编程的工作了,会将一些很基本并且常用的函数集中到函数库中实现。当程序需要函数时直接从库中调用。
库函数的使用分为静态链接和动态链接两种。
- 静态库
编译系统在链接阶段把程序的目标文件和所需的函数库文件链接在一起,这样可执行文件可以在没有函数库的情况下运行。
此方式,执行文件大,但运行效率高。
库的名字一般是libxxx.a;
静态库的制作:以f1,f2制作库,main为主函数为例
- 分别在vim编辑器上编辑f1.c f2.c main.c
- 将f1.c和f2.c编译成 .o函数 gcc -c f1.c f2.c
- 将 .o文件合成静态库 ar -crv libsta.a f1.o f2.o
- 编译 :gcc mian.c -o mian -static -L. -lsta
-L 指定库的路径 -l 指定库的名字
这里-L后是. 表明库的路径是本地,-l后的sta是库的名字
动态库和静态库同时存在,默认是使用动态库。如果要用静态库,加上-static链接选项。
动态库
这类库的名字一般是libxxx.so,动态库又称共享库;相对于静态函数库,动态函数库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数时才调用函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。而且如果多个应用程序都要使用同一函数库,动态库就非常适合,可以减少应用程序的体积。
静态库的制作:还是以上面的程序为例
- 编写三个函数
- 把源函数编译成动态库 gcc -fpic -shared -o libdyn.so f1.c f2.c
- 编译 main.c
-gcc main.c -o main -L. -ldyn - 在运行前把动态库拷贝到/usr/lib/目录下
我觉得现在的库函数大多数都是动态库吧,这样有新的函数直接添加进去,需要使用了直接调用。
关于库这块学习了这两位大牛的文章。
Linux动态库和静态库
第一次写博客,主要为总结学习,初学linux,希望自己可以坚持下去,加油!