linux下的库文件有两种,一种是动态库文件,以.so为后缀,一种是静态库文件,以.a为后缀
通常动态库是有利于程序缩小空间同时有利于程序升级,一般情况下,动态库链接时优先级高于
静态库。
如何生成动态库:
以hello.c hello.h 为例,
该程序生成库文件的文件名为: libhello.a, libhello.so
静态库的生成方法:
gcc -c hello.c -o hello.o(生成目标程序
ar cqs libhello.a hello (连接生成静态库
静态库的生成方法:
gcc -c hello -o hello.o(生成目标程序
gcc -shared -fPIC -Wl, -soname, libhello.so.1 -o libhello.so.1.0 hello.o
(soname 直接传递给链接器处理,连接器在会将soname嵌入到二进制文件中而
不是库文件名称,上述库文件libhehllo.so.1.0,同时库名标志libhello.so.1.
这样就能允许多个版本的库文件的存在。 这样方便
其中: -shared是表示目标代码生成的是共享库而非应用程序
-fPIC 表示生成的共享库是和位置无关,做到可重用性(需要进一步理解
如何使用库:
对于静态库而言,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,所以一旦连接成功,静态程序就可以不再调用。
相对来说,简单来说是在连接时做一个符号标记,执行调用库中函数的才真正调用。
系统中如果同时存在静态库和动态,系统优先选择连接动态库。我们可以使用-Bstatic 和-Bdynamic莱指定应用程序所需要的库。
对于动态库,如果不使用连接选项,我们可以使用dlsym dlopen dlclose来进行库和函数的加载和卸载操作。
库路径的查找:
1.通常应用程序默认的搜索路径为:/usr/lib和/lib目录,并且搜先查找动态库,然后试图查找动态
因此我们可以将动态库放到这两个目录下。
2.同样我们可以使用-L选项来执行库的位置 例如 L./lib 目录,应用程序就会在当前lib目录下查找该库文件(这种连接方式不利于影响程序的移植性
3. LD_LIBRARY_PATH环境变量中加上库所在路径,通常在profile等文件设置,同时通过export LD_LIBRARY_PATH=""进行设置系统环境变量
4. 将库的路径/etc/ld.so.conf加到文件末尾,并执行ldconfig刷新。这样,加入的目录下的所有库文件都可见。
库中符号的显示:
可以nm命令可以打印出库中的涉及到的所有符号。库既可以是静态的也可以是动态的。nm列出的符号有很多,常见的有 三种,一种是在库中被调用,但并没有在库中定义(表明需要其他库支持),用U表示;一种是库中定义的函数,用T表示,这是最常见的;另外一种是所谓的“弱 态”符号,它们虽然在库中被定义,但是可能被其他库中的同名符号覆盖,用W表示。例如,假设开发者希望知道上文提到的hello库中是否定义了 printf():
阅读(404) | 评论(0) | 转发(0) |