1.linux下C程序的原始码通常以c作为后缀(cpp是C++的后缀,gcc会根据后缀来加载不同的链接库,详见:http://7613577.blog.51cto.com/7603577/1605240)。
2.程序编译的几个相关概念:
1)源码:程序代码,人类可以看得懂的程序语言
2)编译程序:源码编译后的机器可以看得懂的代码,通常以o作为后缀
3)可执行文件:经过编译程序编程二进制程序后,机器看得懂的可执行的档案。
3.make相关介绍:
1)make指令执行后,会去找Makefile,通常软件开发商都会写一支侦测程序来侦测用户的作业环境,以及该作业环境是否有软件开发商所需要的其他功能,该侦测程序侦测完毕后,就会主动的建立这个Makefile的规则档案,通常这支侦测程序的文件名为configure或者config
2)侦测程序要侦测的内容有:
是否有适合的编译程序可以编译软件的程序代码
是否已经存在本软件所需要的函式库,或其他的相依软件
操作系统平台是否适合本软件,包括linux的核心版本
核心表头定义档是否存在(驱动必须要的侦测)
3)同一款软件在不同的平台上安装需要重新编译。
4.gcc [-cO] [-l函式库] [-L/函式库目录][Ipath] [-Wall] [-o targetfile] sourcefile:编译程序,选项,
1)-c:编译程序,生成*.o文件
2)-o:链接程序,产生可执行的文件,此时需要指定要生成的文件.
3)-O:可以优化程序,提高性能
4)-Wall:产生详细的编译信息
5)-l:加入某个函式库,m代表libm.so这个动态链接库
6)-L:后接路径,表示函式库要从哪里去查找。
7)-I:后接include要查找的目录
5.#include<stdio.h>:这句话的意思是将一些定义的数据由stdio.h这个档案读入,这包括printf的相关设定,这个档案其实是放在/usr/include/stdio.h的。
6.make指令的优点:
1)简化编译时所需要下达的指令
2)若在编译完成之后,修改某个原始码档案,则make仅会针对被修改了的档案进行编译,其他的Object file不会被更动。
3)最后可以依照相依性来更新执行档。
7.makefile解读:
1)基本格式:
target:目标文件1 目标文件2
<tab> gcc -o 欲建立的执行文件 目标文件1 目标文件2
2)target是我们要建立的信息,而且目标文件就是具有相关性的object files,那建立执行文件语法就是以<tab>按键开头的那一行,命令行必须要以tab按键作为开头才行
3)makefile中用#代表注释,<tab>必须在命令行的第一个字符,target与相依档案(目标文件)之间以:隔开。
8.makefile中变量的基本语法:
1)变量与变量内容以=隔开,同时两边可以具有空格
2)变量左边不可以具有<tab>
3)变量与变量内容在=两边不能具有:
4)在习惯上,变量最好以大写字母为主
5)运用变量时,以${变量}或$(变量)使用
6)在该shell的环境变量可以被套用,例如CFLAGS。
7)在指令模式也可以给予变量
9.当CFLAGS的内容指令列与makefile里面并不相同时,取舍关系如下:
1)make指令列后面加上的环境变量为优先
2)makefile里面指定的环境变量第二
3)shell原本的环境变量第三。
10.一些特殊变量:$@代表目前的target。
11.tarball(压缩包)软件一般的安装方式:
1)./configure:这个步骤是建立Makefile这个档案,通常程序开发者会写一支scripts来检查linux系统,相关的软件属性等,经过侦测后,生成一个与本地环境适应的Makefile文件。
2)make clean:清除旧的编译文件(*.o)
3)make:依据Makefile当中的预设进行编译行为。即将原始码编译为可执行的文件,而这个可执行文件会放置在目前所在的目录下,尚未被安装到预定的目录下。
4)make install:依据Makefile这个档案关于install的项目,将上一个步骤产生的编译完成的数据安装到预定的目录中。
12.动态与静态函式库
1)静态函式库:扩展名为.a,这类函式库在编译的时候会直接整合到执行程序当中,所以一般该方式生成的可执行文件会比较大些。另外这类函式库的最大优点就是可以独立运行,不依赖于其他函式库。但升级难度较大。
2)动态函式库:扩展名.so,这类函式库当执行档要使用到函式库的机制时,程序才会读取函式库来使用,因此生成的文件会小一点。由于是动态读取,因此该模式的函式库独立性较差,不过升级比较容易。
13.将动态函式库加载到高速缓存中可以提高函式库的存取效能,具体步骤为:
1)首先,我们必须要在/etc/ld.so.conf里面写下想要读入告诉缓存当中的动态函式库所在的目录(不是档案)。
2)家下来则是利用ldconfig这个执行档将/etc/ld.so.conf的资料读入缓存当中。
3)同时也将数据记录一份在/etc/ld.so.cache这个档案中。
14.ldconfig [-f config] [-C cache] [-p]:将动态函数库预先载入内存,参数:
1)-f:指定library函数库的路径(文件),默认是/etc/ld.so.conf
2)-C cache:指定cache的内容(文件名),默认/et/ld.so.cache
3)-p:列出目前所有函数库资料内容(在/etc/ld.so.cache内的内容)
2.ldd [-vdr] [filename]:程序的动态函数库解析,参数,
1)-v:列出所有内容信息
2)-d:重新将资料有遗失的link点显示出来
3)-r:将ELF有关的错误显示出来
3.md5sum/sha1sum [-bct] filename;md5sum/sha1sum [--status|--warn] --check filename:一种软件安装加密技术,参数,
1)-b:使用binary的读档方式,默认为Windows/DOS 档案型态的读取方式。
2)-c:检验档案指纹
3)-t:以文字形式来读取档案指纹。