linux之动态库与静态库
来源:互联网 发布:网页信息采集软件 编辑:程序博客网 时间:2024/06/08 15:46
使用动态库时,系统会检查该动态库是否已经加载,如果已经加载,则直接映射即可,如果没有加载,那么会加载之后再映射。
如果动态库中有全局变量,那么该全局变量对于不同的进程来说,是相互独立和隔离的。
链接静态库时,静态库被一起编译进可执行程序,运行时不再依赖静态库。
动态库编译:gcc -fpic -shared a.c b.c -o libtest.so链接动态库gcc main.c -ltest -L. -o mybin运行程序时export LD_LIBRARY_PATH=.或者将动态库拷贝到/usr/lib./mybin静态库打包:ar rcs libtest.a a.o b.o链接库时,如果有同名的动态库和静态库,默认优先动态库,如果要链接静态库,那么使用-static,比如gcc a.c -lmylib -static通过以下方式可以指定某些库使用静态链接,而某些库使用动态链接-Wl,-Bstatic -ltest -Wl,-Bdynamic -ltest2
1.linux下生成动态库
(1)建立一个文件,lib.c
,该文件的内容如下,然后终端执行命令:gcc -shared -fpic -o libmylib.so lib.c
;
其中 -shared -fpic是必选命令
; libmylib.so根据标识符规则自命名
, lib.c是刚建立的文件名
;该命令执行后,当前的目录下就会有一个名为:libmylib.so的动态链接库文件
;
/************************************************************************* * File Name: lib.c * Author: lixiaogang * Mail: 2412799512@qq.com * Created Time: 2017年06月02日 星期五 20时11分08秒 ************************************************************************/#include<stdio.h>#include<stdlib.h>int a;void hoge(){ printf("hello world.\n");}
(2)再在当前目录下建立一个test.c
;该文件里面的内容如下;接着执行gcc test.c -lmylib
;(注意:不用写libmylib.so
中的lib和.so后缀);此时编译会报错,并提示:
/usr/bin/ld: cannot find -lmylibcollect2: error: ld returned 1 exit status
找不到库,因为linux默认是去PATH环境里找,但是PATH环境里面没有该库,所以报错;
/************************************************************************* * File Name: test.c * Author: lixiaogang * Mail: 2412799512@qq.com * Created Time: 2017年06月02日 星期五 20时24分33秒 ************************************************************************/#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>/*使用了动态库中的全局变量和函数*/extern int a;extern void hoge();int main(int argc,char *argv[]) { int a = 66; printf("a = %d\n",a); hoge(); return 0; }
(3)接着执行命令:gcc test.c -L. -lmylib
;(L表示增加收索路径,其中的“.”表示是在当前的位置收索);这时候不会提示错误了,但是执行./a.out
的时候,仍然会报错,如下:原因如上;
./a.out: error while loading shared libraries: libmylib.so: cannot open shared object file: No such file or directory
(4)执行命令:export LD_LIBRARY_PATH=.
;注意PATH和=之间没有空格,
接着./a.out
便可成功得出结构:
a = 66hello wrold.
结论:-shared -fpic
是必须写的,语法规定就这么用;编译出来的动态链接库一般前缀要加lib,后缀要加.so(so意为:shared object)
;export LD_LIBRARY_PATH=.其中export是设置环境变量
;这样设置的环境变量只有在该终端中有效,在另外一个终端中就无效了;若希望其永久生效,可以将其写在
/etc/profile文件下面,这样每次系统启动的时候就会自动生效
(2)静态链接库
文件仍然采用上面lib.c和test.c
;首先第一步为:gcc -c lib.c
;此时目录下会生成一个lib.o
的文件;接着执行命令
:ar rcs lib_testlib.a lib.o
,这时会生成一个名为:
lib_testlib.a
的文件;再执行命令:gcc test.c -l_testlib -L. -static
便可成功的生成静态库的链接;
执行:./a.ouot
得结果为:
a = 66hello world.
这里值得注意的是,若当前的目录下即有动态链接库,又有动态链接库的话,则默认是去找动态链接库,若要显示的声明去找静态链接库的时候,加上-static;
- linux之动态库与静态库
- linux 静态库与动态库
- linux下动态库与静态库
- linux中的静态库与动态库
- Linux动态库与静态库
- Linux静态库与动态库制作
- linux 动态库与静态库
- Linux下动态库与静态库
- Linux下动态库与静态库
- linux静态库与动态库制作
- Linux 动态库与静态库
- 动态库与静态库【linux】
- Linux下静态库与动态库
- Linux中的动态库与静态库
- linux 动态库与静态库
- linux动态库与静态库
- Linux静态库与动态库
- [4]Linux静态库与动态库
- Html基本标签
- 58 C语言跳出循环
- [JZOJ5130][51nod1446][SDOI省队集训2017]苹果树
- C++/MFC-进程/线程亲缘性
- 活动轮廓模型之Snake模型简介
- linux之动态库与静态库
- CTF安卓逆向练习第一弹
- 剑指offer-24-二叉树中和为某一值的序列
- 结构体指针
- 【LeetCode】283.Move Zeroes解题报告
- 59 C语言循环结构的嵌套
- Linux中的poll机制
- CodeForces Round #417 E Solution:Nim博弈
- Spring_JSR 303标准的校验框架与SpringMVC际化、及校验字符串消息国际化