库分两种:
1、静态库(static library),后缀名.a,目标文件的集合。
所谓静态的意思是:应用需要将库拷贝。
所谓拷贝是这样的过程:在link时,连接器根据程序所需的函数,将之拷贝到执行文件,所以可执行文件的大小会比使用动态库大,且一旦完成连接,静态库即可删除。
生成和使用静态库的方法:
g++ -c XXX.cpp 生成 XXX.o
(动态库和静态库都是由.o文件组成)
打包生成.a
ar crv libXXX.a XXX.o
(静态库命名规范,lib开头,.a结束。编译器会在-L选项指定目录和系统设置路径下,搜索-l参数前加上前缀lib,然后追加扩展名.a得到的静态库文件名来查找静态库文件)
使用
g++ test.cpp -static -L. -lXXX
2、动态库(Shared library),后缀名.so,ELF格式的文件
共享库:在连接时会在执行程序中留下标记,指明当程序执行时,要载入库动态。
生成和使用动态库的方法:
g++ -shared -fPCI -o libXXX.so XXX.o
使用
连接时可以用-L指定,但是执行时,必须执行下面三步中的一个:
1、把库拷贝到/usr/lib和/lib目录下。该目录是搜索静态库和动态库的缺省目录。
2、修改 LD_LIBRARY_PATH环境变量,将动态库所在路径加入。
3、 修改/etc/ld.so.conf文件,把库所在的路径加到文件末尾,并执行ldconfig刷新。
另外:
在搜索-l指定的库时,动态库优先级高,如果要指明连接静态库,需要加如下参数告诉连接器(-Wl 表示后面的参数直接传给连接器ld进行处理 )
-WI,-Bstatic
同理,限定加载动态库,采用如下参数
-WI,-Bdynamic
nm命令可以查看库中涉及的所有符号
U表示使用但未定义的(涉及到别的库)
T表示库中定义的方法
本文介绍了静态库和动态库的基本概念及它们之间的区别。静态库在链接时会被复制到可执行文件中,而动态库则是在运行时加载。文章还详细解释了如何创建和使用这两种类型的库。
487

被折叠的 条评论
为什么被折叠?



