Linux 学习笔记 2016.03.24
买了个开发板,估计明后天才到,这两天在看LINUX下面一些开发工具。就把这两天记得笔记弄到电脑上吧。
1、动态链接库和静态链接库的区别,动态链接库没有将程序需要的库里面的文件都包含在工程里面,而是在需要用动态库的地方放上被需要的代码段的链接地址,在程序执行时便将该代码段放到内存里面执行,因此连接动态库的程序离不开动态库实体,不能独立运行,但是这样比较节省程序本身的空间,党系统中有很多程序都链接在一个库上面时,动态库的好处就很快体现出来了。而静态库是链接时把源码都直接放到程序里面,这样会造成程序空间变得大很多,但是却可以独立运行。
2、在程序中文件包含符号的区别 “<>”,尖括号进行的包含系统在编译时会去系统默认的文件路径里面去找.h文件,而用“ “” ”双引号进行的文件包含系统会先在当前c文件所在路径下进行查找,如果没有找到就会去系统默认路径下去查找,双引号的情况包含着尖括号的情况。
3、makefile 的相关知识。makefile是属于一个工程的,对于一个工程中有多个c文件为了调试方便而创建的文件,它相当于一个调试用的脚本,吧各种调试命令集合到一个文件中,当在命令窗输入make + 参数时,会执行相应的命令,相当于在windows中各种编译软件中的编译和全部编译能按钮。
4、makefile的编写规则
target:prerequisites
comand
其中taget 是编译目标,prerequisites是依赖文件,command是执行的命令,一个makefile中可以有多个上述组合,以实现多中文件的编译,编译规则是如果prerequisites中有一个或者多个文件发生变化,就重新执行一遍comand,注意,target只是一个标识符,所以它可以使任何字符串,他的作用是在命令窗口输入 make +target时执行相应的comand。
5、第一组命令习惯用all作为target,这是make命令的默认字符,在命令窗口输入 make和输入 make all效果是一样的。
6、为了防止target与当前目录下的文件重名,可以再makefile里面将目标定义为伪目标,定义方法用PHONY :tartget,就能将target定义为伪目标,可以一句里面定义多个伪目标,各个伪目标中间用空格隔开,也可以在一句里面只声明一个伪目标。在makefile文件中,经常加上clear命令去掉中间生成的文件,具体命令实体为
.PHONY:clean
(TAB)-rm -v a.out
功能是将中间文件a.out删除,rm -v a.out就是普通的删除命令,前面加上的-是如果该命令发生错误,那么久报出该错误,但同时也忽略该错误,继续往下执行,因为很可能第一遍运行这个命令已经将该文件删除,但是第二遍运行时没有了该文件已经没有了,会报错,同时会卡住程序不执行,但是这样的错误其实是没有意义的,因此可以用该命令将错误忽略,让程序继续执行。在命令前加横短线都有这个功能,不仅限于此命令。
7、Linux下的文件名后缀并不影响文件性质,只是一般意义上的命名习惯,这点个windows下的文件命名规则不同.
8、gcc编译过程 gcc aa.c -o bb 这是直接将aa.c编译为可执行文件bb。参数也可以反过来 gcc -o bb aa.c,如果不要-o bb则默认生成课执行文件 a.out
gcc -E aa.c -o bb.i 这是编译过程的第一步,预编译的语法,将生成预编译文件 bb.i,如果不要-o则只进行预编译过程,没有文件输出。注意参数E必须大写
gcc -s aa.i/aa.c -o bb.s 这一步是编译,编译完成后将生成汇编文件 bb.s,S参数必须大写,-o如果去掉的话会生成默认汇编文件aa.s
gcc -c aa.c/aa.s 这一步是汇编,默认生成机器文件aa.o,也可以用 -o指定输出路径,参数-c可以小写。
gcc aa.o/aa.c 链接, 默认生成 a.out文件,也可以用-o指定输出文件名。