程序安装目录、头文件、库文件
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.1.1 程序安装目录、头文件、库文件
Linux下使用C语言开发应用程序时,完全不使用第三方函数库的情况是比较少见的,通常来讲都需要借助一个或多个函数库的支持才能够完成相应的功能。从程序员的角度看,函数库实际上就是一些头文件(.h)和库文件(.so或.a)的集合。虽然Linux下大多数函数默认将头文件放到/usr/include/目录下,库文件放到/usr/lib/目录下,但并不是所有的情况都是这样。正因如此,gcc在编译时必须让编译器知道如何来查找所需要的头文件和库文件。
对Linux开发人员来说,在编写程序之前,要清楚软件工具和开发资源所在的位置。
1.程序安装目录
Linux下的程序通常都保存在专门的目录里。
这些目录有:/usr/bin、/usr/local/bin、/usr/local。
系统程序在/usr/bin子目录里。系统管理员为某个特定的主机系统或本地网络添加的程序在/usr/local/bin子目录里。系统管理员一般都比较喜欢使用/usr/local子目录,因为它可以把供应商提供的程序和后来添加的程序以及系统本身提供的程序隔离开来。/usr子目录的这种布局方法在需要对操作系统进行升级时非常有用,因为只有/usr/local子目录里的东西需要保留。GNU的C语言编译器(gcc)通常安装在/usr/bin或者/usr/local/bin子目录里。
2.头文件
使用C语言和其它语言进行程序设计时,需要头文件来提供对常数的定义以及对系统和库函数调用的声明。对C语言来说,这些头文件一般都保存在/usr/include及其下级子目录里。对于UNIX/Linux操作系统特定版本的头文件,一般保存在/usr/include/linux 或/usr/include/sys子目录里。
gcc采用搜索目录的办法来查找所需要的文件,-I选项可以向gcc的头文件搜索路径中添加新的目录,例如:# gcc -I /usr/ztg/include hello.c,该命令会使编译器在/usr/ztg/include 子目录和标准安装目录两个位置查找hello.c程序里包含的头文件。
3.库文件
库文件是一些预先编译好的函数的集合,那些函数都是按照可再使用的原则编写的。它们通常由一组互相关联的用来完成某项常见工作的函数构成。
标准的系统库文件一般保存在/lib或/usr/lib子目录里。编译时要告诉C语言编译器(其实是链接程序)应去查找哪些库文件。默认情况下,只查找C语言的标准库文件。
库文件必须遵守一定的命名规则,库文件的名字永远以lib打头,随后是说明函数库情况的部分(比如用c表示这是一个C语言库,m表示这是一个数学运算库等)。文件名的最后部分给出这个库文件的类型,函数库一般分为静态和共享两种格式,如下所示:.a:静态型函数库(静态链接库)。
.so:共享型函数库(动态链接库)。
执行# ls /usr/lib命令可知。
如果使用了不在标准位置的库文件,则可以通过-L选项向gcc的库文件搜索路径中添加新的目录。例如,如果在/home/ztg/lib/目录下有链接时所需要的库文件libapp.so,为了让
-l选项指示gcc去链接库文件libapp.so。Linux下的库文件在命名时有一个约定,那就
是应该以lib三个字母开头。由于所有的库文件都遵循了同样的规范,因此在用-l选项指定链接的库文件名时可以省去lib三个字母。也就是说gcc在对-lapp进行处理时,会自动链接名为libapp.so的文件。
(1)静态库
静态库也叫做档案(archive),可以认为是一些目标代码的集合,静态库的文件名按惯例以“.a”作为文件后缀名。比如C语言标准库为/usr/lib/libc.a。使用ar(archive)命令可以创建静态库。例如:ar rcs my_libraty.a file1.o file2.o,表示把file1.o和file2.o加入到静态库my_library.a中,如果my_library.a不存在,会自动创建。
当有程序需要用到静态函数库中的某个库函数时,会通过include语句引用对此函数做出声明的头文件,编译器和链接程序负责把程序代码和库函数结合在一起,组成一个独立的可执行程序。如果使用的不是标准的C语言运行库而是某个扩展库,就必须用-l选项来指定静态库。
注意:使用gcc进行编译时,要注意参数的顺序,由于-l是链接器选项,因此一定要放在被编译文件名之后,如果放在文件名之前,会链接失败,并会出现莫名其妙的错误。
因共享库有着更大的优势,静态库已不被经常使用。但静态库使用简单,仍有使用。
(2)共享库
静态库的缺点是,在同一时间如果运行多个程序,而它们又都使用同一个函数库里的库函数时,内存里就会有许多份同一函数的备份,程序文件本身也有许多份同样的备份。这会消耗大量宝贵的内存和硬盘空间。
为了克服静态库的缺点,提出了共享库。共享库是在程序启动时被加载到执行程序中的,并且可以被多个执行程序共享使用。
共享库的存放位置和静态库是一样的,但有着不同的文件名后缀。在一个典型的Linux 系统上,C语言标准库的共享版本是/usr/lib/libc.so。
默认情况下,gcc在链接时优先使用共享库,只有当共享库不存在时才考虑使用静态库。如果需要的话可以在编译时加上-static选项,强制使用静态库。例如,如果在/home/ztg/lib/目录下有链接时所需要的库文件libapp.so和libapp.a,为了让gcc在链接时只