您的位置:首页 > 运维架构 > Linux

linux 静态库 动态库常识

2012-10-09 08:48 309 查看
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=

查看库中函数列表

静态库用ar -t libxxx.a

动态库用 nm -D libxxx.so

静态库,最好办法是查看头文件

动态库,一般都有说明文档

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=

#linux库名命名规范

静态库libXXX.a

动态库libXXX.so

引用时只需使用XXX即可引用

-lxxx 即可

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=

一个静态库引用另一个静态库

1.假如有两个.a libx.a 里面需要调用liby.a的接口函数

那么,将代码编译生成libx.a的时候,不需要liby.a的,只需要y里面的头文件即可

但是,当给调用者使用libx.a的时候,必须都加上去,也就是-lx -ly, 不能够只有-lx

(而且注意顺序,-ly -lx都不行)

2.有一个办法 就是 把第二个.a文件ar -x 编程.o 文件

然后把第一个.a文件也ar -x 编程.o文件

然后ar -c 把所有的.o文件打包起来

假设前一个是a,后一个是b,只需要在a的代码里包含b的头文件即可。

不过要注意的是,每次修改b库的代码,要重新编译b再重新编译a.

.a 文件的结构和.tar文件就没有什么区别。 x 命令解出来, a 命令添加, t命令列表

楼主的要求只需要,假设A.a, B.a C.a 在/usr/local/lib目录下

mkdir /tmp/libABC

cd /tmp/libABC

ar x /usr/local/lib/A.a

ar x /usr/local/lib/B.a

ar x /usr/local/lib/C.a

ar cru libABC.a *.o

ranlib libABC.a

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=

动态库:

1.编译时,把头文件,库文件路径,库文件包括进去

2.连接时,将动态库加入到动态库搜索路径中

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=

源代码安装软件,第三方开发源码库,都提供编译链接参数程序:

格式大概如下:

XXX-config

XXX_config

位置一般在程序包/bin 目录下.

比如

1.

gtk1.2的链接参数生成程序是gtk-config,

执行gtk-config --libs就能得到以下输出:- L/usr/lib -L/usr/X11R6/lib -lgtk -lgdk -rdynamic

2. mysql的编译链接参数生成程序mysql_config

root@OP_39_184_sles10:/home/li/c/mysql/ver3/include# mysql_config

Usage: /usr/local/mysql/bin/mysql_config [OPTIONS]

Options:

--cflags [-I/usr/local/mysql/include/mysql]

--include [-I/usr/local/mysql/include/mysql]

--libs [-L/usr/local/mysql/lib/mysql -lmysqlclient -lz -lcrypt -lnsl -lm]

--libs_r [-L/usr/local/mysql/lib/mysql -lmysqlclient_r -lz -lpthread -lcrypt -lnsl -lm -lpthread]

--socket [/tmp/mysql.sock]

--port [3306]

--version [5.0.37]

--libmysqld-libs [-L/usr/local/mysql/lib/mysql -lmysqld -lz -lpthread -lcrypt -lnsl -lm -lpthread -lrt]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: