linux中编译静态库(.a)和动态库(.so)的基本方法_only you
linux中编译静态库(.a)和动态库(.so)的基本方法
2007-10-24 14:19 静态库
在 linux
在 linux 环境
中 , 使用 ar 命令创建静态库文件 .如下
是命令的选项 :
d 从指定的静态库文件中删除文件把文件移动到指定的静态库文件中
p 把静态库文件中指定的文件输出到标准输
快速地把文件追加到静态库文件中
把文件插入到静态库文件中
t 显示静态库文件中文件的列表
x 从静态库文件中提取文件
还有多个修饰符修改以上基本选项,详细请 man ar
以下列出三个 :
把新的目标文件(*.o)添加到静态库文件中
现有文件之后
b *************************************** 之前
v 使用详细模式
ar 命令的命令行格式如下
ar [-]{dmpqrtx}[abcfilNoPsSuvV] [membername]
[count] archive files...
参数 archive 定义库的名称 , files 是库文件中包含的目标文件 的清单 , 用空格分隔每个文件 .
比如创建一个静态库文件的命令如下
ar r libapue.a error.o errorlog.o lockreg.o
这样就了 libapue.a 静态库文件 , 可以用 t 选项显示包含在 库中的文件
创建库文件之后 ,可以创建这个静态库文件的索引来
帮助提高和库连接的其他程序的编译速度 .使用 ranlib 程序 创建库的索引 ,索引存放在库文件内部 .
ranlib libapue.a
用 nm
用 nm 程序显示存档文件的索引
,它可以显示目标文件的符号
nm libapue.a | more
如果是显示目标文件的符号
nm error.o | more
如何使用呢 ? 如下所示 :
中的函数了 .
中的函数了 .
这样就可以在 test.c 中调用在 libapue.a
动态库
1.创建共享库
gcc -shared -o libapue.so error.o errorlog.o 这样就创建了共享库 !
2.编译共享库
假设共享库位于当前目录 (即跟程序文件相同的目录中
gcc -o test -L. -lapue test.c
这样就编译出了不包含函数代码可执行文件了,但是但你运
行时会发现 linux 动态加载器打不到 libapue.so 文件 .
可以用 ldd 命令查看可执行文件依赖什么共享库
ldd test
如何才能让动态加载器发现库文件呢 ? 有两种方法可以解决 :
LD_LIBRARY_PATH 环境变量
/etc/ld.so.conf 文件
1.环境变量
export
LD_LIBRARY_PATH="$LD_LIBRARY_PATH:."
2.修改 /etc/ld.so.conf 文件.位于 /etc/ld.so.conf
般应用程序的库文件不与系统库文件放在同一个目录下
般把应用程序的共享库文件放在 /usr/local/lib 下 ,新建一个
属于自己的目录 apue, 然后把刚才 libapue.so 复制过去就行 同时在 /etc/ld.so.conf 中新增一行 : /usr/local/lib/apue 以后在编译程序时加上编译选项
-L/usr/local/lib/apue -lapue
这样就可以使用这个 libapue.so 共享库了 !!
全文结束 !! 写此文章参考了 :<
Language>>.
这是一本好书 !如果是学习 AT&T 汇编语法 ,建议
阅读此书 !!