[初级]
[作者] Wick
文章选取的例子非常简单,上手容易,只是为了讲述静态与动态链接库的生成和链接过
程,还有他们之间的区别。以下例子在 gcc 4.1.1 下顺利通过。
文件预览
文件目录树如下,如你所见,非常简单。
- libtest/
- |-- lt.c
- |-- lt.h
- `-- test.c
代码
#lt.c
-
-
-
-
- #include <stdio.h>
-
- void myprint(void)
- {
- printf("Linux library test!\n");
- }
# lt.h
#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.o liblt.a -o test
这个时候再来看他的引用库情况。
- $ ldd test
- 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 ?恩,这就是静态与动态的最大区别,静
态情况下,他把库直接加载到程序里,而在动态链接的时候,他只是保留接口,将动态库与
程序代码独立。这样就可以提高代码的可复用度,和降低程序的耦合度。
分享到:
相关推荐
linux静态库和动态库的区别
Linux静态and动态链接库 创建和使用Linux静态and动态链接库 创建和使用
linux下面的库文件有两种:静态链接库(xx.a)和动态链接库(xx.so)。 当一个程序使用静态链 接库,那么当link的时候,连接器会把所需要的函数拷贝到源程序里面,这样,当编译完以后,静态链接库就可以不需要了。如果...
Linux C 静态链接库 动态链接库 简单介绍 看完本例子,可以入门了。。。。
Linux静态动态链接库的创建和使用
本文描述了Linux下使用动态链接库和静态链接库的项目建立及单步调试
linux下如何生成使用静态和动态链接库
简单的Linux下的静态库和动态链接库的编译方法和使用发发
linux静态链接库与动态链接库的区别及动态库的创建.pdf
文档介绍了linux下静态库和动态库生成以及使用问题。文档介绍了linux下静态库和动态库生成以及使用问题。
linux静态链接库与动态链接库的区别及动态库的创建借鉴.pdf
linux静态链接库与动态链接库的区别及动态库的创建参考.pdf
linux qt 动态链接库 静态链接库.docx
linux qt 动态链接库 静态链接库.pdf
默认编译是静态库,但考虑到 linux 上动态库使用较多,所以使用 -DBUILD_SHARED_LIBS=ON 参数编译为动态库。 在 centos 7 下使用 gcc 4.8.5 + cmake 3.16.9 编译,包含 bin, include, lib, lib64, share 五个目录,...
自己学习的笔记,主要讲述的是动态库和静态库的创建,使用,以及一些学习中遇到的问题!
linux下静态链接库和动态链接库编译和使用[1].pdf
NULL 博文链接:https://cherishlc.iteye.com/blog/2265220
动态链接库及静态链接库(windows下的.dll .lib和linux下的.so .a).docx