本文是作者阅读Linux开发相关图书做的笔记之一,主要描述Linux上开发的环境基本知识。
1.应用程序:
指一些工具和系统提供的程序;通常可在目录/usr/bin中找到。系统管理员为特定的主机或本地网络添加的程序在/usr/local/bin或/opt中找到。
建议在/usr/local目录结构下编译运行自己的程序,并访问必要的文件,这样可以在系统升级的时候值需要把这个目录做备份就可以了。
其他一些功能和编程系统都可能有自己的目录结构;例如X视窗在/usr/X11目录下。
GNU编译系统的驱动程序gcc一般位于/usr/bin或/usr/local/bin目录中,但会从其他目录运行各种编译器支持的程序。
2.头文件
C语言的一些头文件,依赖特定Linux版本的头文件在目录/usr/include/sys和/usr/include/linux中找到。
其他编程系统也有自己的include目录,但通常都能被搜索到;例如:GNU C++的/usr/include/g++
gcc编译的时候使用-I选项来添加搜索目录。
3.库文件
库文件通常是函数集合,可重用。标准系统库文件一般在/lib和/usr/lib下。C语言编译器(连接程序)会知道要搜索那些库文件。
库文件的名称总是以lib开头,后面说明说明库(例如:c代表C语言库,m代表数学库),文件名结尾以.跟上后缀来表示类型:
.a表示静态库,类似windows的.lib
.so代表共享函数库,类似windows的.dll
在连接的时候使用-l来告诉编译器搜索指定库文件。另外对于某些特定库,可以使用缩写来表示;例如:-lm表示数学库(libm.a);而使用-L可以来为编译器增加搜索路径。
4.静态库
正如前面所说,静态库是.a结尾;通常也被叫做归档文件,可以使用ar程序和gcc -c名来创建自己的静态库。
静态库的缺点是:如果多个程序需要使用来自同一个静态库的函数,那么这个函数的代码在内存中会出现多份;这造成额外的内存浪费。
5.动态库
为了克服静态库的缺点而设计的函数库。以.so结尾。使用动态库的程序不连接具体函数代码,而在运行时将动态库装载,并且访问共享代码。这样在多个程序访问一个共享库的时候只需要在内存中保存一份代码。
在Linux系统中负载装载和解析程序中引用的程序是ld.so。搜索共享库的其他位置可以在文件/etc/ld.so.conf中配置;修改这个文件后需要使用ldconfig来处理。
可以使用ldd来查看程序需要哪些共享库。
例如:对我自己写的一个程序进行ldd,
ldd test,结果为:
linux.gate.so.1 => (ox...)
libc.so.6=>
括号内的是库的地址。