1.Ubuntu目录结构
在Ubuntu使用记录(常用命令与目录树)中我总结了一些关于Ubuntu/Linux的目录的一些知识,这里回顾一下。
软件主要分为3类,可以用which命令查看,一个软件/命令的位置
①/sbin
表示系统的一些程序,比如shutdown
②/bin
表示一些可以用在bash上面的命令,比如ps,ls等
③/usr/bin
表示其他安装的软件,比如我们需要apt-get install安装的软件,比如firefox,gcc,codeblocks等等
2.库文件
总结自:http://www.cnblogs.com/skynet/p/3372855.html
(1)什么是库
简单说,库就是一些头文件与库文件(可能包括静态库与动态库两种)的集合。
库文件通过头文件向外导出接口,头文件中有函数的声明,库文件中是对应的实现。
(2)位置
①安装的第三方软件
/usr/bin 可执行文件
/usr/lib 可执行文件的库文件
/usr/include 可执行文件的头文件
②安装的第三方库
/usr/local/bin 安装的库的一些测试程序
/usr/local/lib 安装的库的库文件
/usr/local/include 安装的库的头文件
(3)静态库
①格式
.a
②加载阶段
编译四大阶段的链接阶段
③本质
一系列目标文件(.o文件)的集合
④特点
程序在运行时与函数库再无瓜葛,移植方便。
浪费空间和资源,所有相关的目标文件与涉及到的函数库被链接合成一个可执行文件。
如果库有更新,且要加载新库,需重新编译整个应用程序。
⑤使用
在Ubuntu/Linux下面,只需在编译的时候指定搜索路径与静态库名
-L 表示要连接的库所在目录
-l 表示链接时需要的静态库(比如libev的静态库文件libev.a在编译的时候,只需要-lev即可)
(4)动态库
①格式
.so
②加载阶段
动态库是在程序运行时,才被加载到内存中。
多个程序如果使用相同的动态库,在内存中只会存在一份拷贝。
③特点
可以实现进程间资源共享,因此也叫坐共享库。
使得程序升级变地简单,只需要更新动态库文件即可。
甚至可以做到链接载入完全由程序员在程序代码中控制(显式调用)。
④使用
由于涉及到编译以及运行两个阶段的库文件查找,所以有两个需要注意的地方。
A。编译阶段
一样的-L和-l
B。运行阶段
由于需要在运行的时候也要找到动态库文件的位置。
这个是在/etc/ld.so.cache文件里面记载的,系统默认在这个文件里面记载有/lib以及/usr/lib
所以,如果你是安装的第三方库,或者是自己生成了一个动态库,你的库文件是在/usr/local/lib中或者其他地方,系统是默认找不到的。
这个时候,编译没有问题,可是一旦运行,系统就会提示找不到某某库文件。
解决办法是修改/etc/ld.so.cache,但是注意,由于这不是一个配置文件,所以不能直接修改。
要通过/etc/ld.so.conf来修改,假设我安装了第三方库libev,库的目录是/usr/local/lib,那么我就要这样做。
$vim /etc/ls.so.conf
另起一行,加上/usr/local/lib
$ldconfig ,该命令会根据ld.so.conf文件重建ld.so.cache文件,这个时候就能愉快地使用第三方库啦!
⑤补充
ldd命令,ldd 某应用程序
可以查看该应用程序依赖的动态链接库。