Linux 动态链接库和静态库示例
来源:互联网 发布:杭州淘宝城附近楼盘 编辑:程序博客网 时间:2024/05/21 06:03
转:
http://www.cnblogs.com/changefuture/archive/2011/12/22/2297460.html
文件预览
文件目录树如下,如你所见,非常简单。
- libtest/
- |-- lt.c
- |-- lt.h
- `-- test.c
代码
#lt.c
- /* lt.c
- *
- */
- #include <stdio.h>
- void myprint(void)
- {
- printf("Linux library test!\n");
- }
# lt.h
- /* lt.h
- *
- */
- void myprint(void);
#test.c
- /* test.c
- *
- */
- #include "lt.h"
- int main(void)
- {
- myprint();
- return 0;
- }
先看静态库
首先做成静态库 liblt.a 。
- $ gcc -c lt.c -o lt.o
- $ ar cqs liblt.a lt.o
再者,链接,这里指定了静态库的位置,注意文件顺序不可乱序。
- $ gcc test.c liblt.a -o test
这个时候再来看他的引用库情况。
- $ ldd test //ldd 是用来查看链接那些动态链接库
- linux-gate.so.1 => (0xffffe000)
- libc.so.6 => /lib/libc.so.6 (0xb7e29000)
- /lib/ld-linux.so.2 (0xb7f6e000)
动态库
做成动态库 liblt.so 。
- $ gcc -c lt.c -o lt.o
- $ gcc -shared -Wall -fPIC lt.o -o liblt.so
链接方法I,拷贝到系统库里再链接,让gcc自己查找
- $ sudo cp liblt.so /usr/lib
- $ gcc -o test test.o -llt
这里我们可以看到了 -llt 选项,-l[lib_name] 指定库名,他会主动搜索
lib[lib_name].so 。这个搜索的路径可以通过 gcc --print-search-dirs来查找。
链接方法II,手动指定库路径
- $ cc -o test test.o -llt -B /path/to/lib
这里的-B 选项就添加 /path/to/lib 到gcc搜索的路径之中。这样链接没有问题但是方法II
中手动链接好的程序在执行时候仍旧需要指定库路径(链接和执行是分开的)。需要添加系
统变量 LD_LIBRARY_PATH :
- $ export LD_LIBRARY_PATH=/path/to/lib
这个时候再来检测一下test程序的库链接状况(方法I情况)
- $ ldd test
- linux-gate.so.1 => (0xffffe000)
- liblt.so => /usr/lib/liblt.so (0xb7f58000)
- libc.so.6 => /lib/libc.so.6 (0xb7e28000)
- /lib/ld-linux.so.2 (0xb7f6f000)
恩,是不是比静态链接的程序多了一个 liblt.so ?恩,这就是静态与动态的最大区别,静态情况下,他把库直接加载到程序里,而在动态链接的时候,他只是保留接口,将动态库与程序代码独立。这样就可以提高代码的可复用度,和降低程序的耦合度。
0 0
- Linux 动态链接库和静态库示例
- Linux 动态链接库和静态库示例
- [Linux]链接,静态库和动态库
- Linux链接,静态库和动态库
- [Linux]链接,静态库和动态库
- [Linux]链接,静态库和动态库
- linux 编译静态链接库和动态链接库
- linux下静态链接库和动态链接库
- linux下的静态链接库和动态链接库
- Linux下的动态链接库和静态链接库
- Linux下的动态链接库和静态链接库
- linux静态链接库和动态链接库简单使用
- linux编程之静态链接库和动态链接库
- Linux下动态链接库和静态链接库
- linux中的动态链接库和静态链接库
- 动态库链接静态库示例
- 分析Linux下静态链接库和动态链接…
- linux动态链接库示例
- linux device注册
- UserHandle.ALL、UserHandle.CURRENT、UserHandle.CURRENT_OR_SELF、UserHandle.OWNER的定义与区别
- linux中的mysql5.6升级到5.7
- 欢迎使用CSDN-markdown编辑器
- 使用jmeter进行http接口测试
- Linux 动态链接库和静态库示例
- 基于 Quartz 开发企业级任务调度应用
- bootstrap datetimepicker的两个设置
- JPA-@oneToOne
- 【C#】对“xxxx::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用。
- 滴滴WebApp实践经验分享
- study-16:HTTP协议 + Apache2.2
- JVM调优总结(一)-- 一些概念
- 转载 2016最新Java学习计划