zl程序教程

您现在的位置是:首页 >  后端

当前栏目

C语言的静态库与共享库

C语言静态 共享
2023-09-27 14:26:36 时间

函数库是由系统建立的且有一定功能的函数集合。库中存放函数的名称和对应的目标代码,以及连接过程中所需的重定位信息,但是库中对应的函数的源代码一般是不可见的,而对应的头文件中可以看到它的对外接口(函数原型)。
Linux中标准的C函数库放置在/usr/lib下,以文件形式存放。用户也可以根据自己的所需建立自己的用户函数库。函数库分为静态库(.a)和共享库(.so,ShareObj),共享库在windows环境也叫动态链接库(.dll)。


静态库是一些.o目标文件的集合,一般以.a形式结尾。静态库在程序链接阶段使用,链接器将程序要用到的函数从库中提取出来,并整合到程序中,程序运行不再使用静态库了。由于每个程序要用到函数都从库提取并整合在一起,所以可执行文件夹会比较大。


wu_being@UbuntuKylin1704:~/Code/C$ mkdir lib_test

wu_being@UbuntuKylin1704:~/Code/C$ cd lib_test/

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ l

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ mkdir bin include obj src

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ l

bin/ include/ obj/ src/

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ vim src/mymath_test.c

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ cat -n src/mymath_test.c 

 1 #include stdio.h 

 2 #include "mymath.h"

 4 int main()

 6 printf("My Pi: %lf"\n, my_pi());

 7 return 0;

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ vim include/mymath.h

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ cat -n include/mymath.h 

 1 #ifndef __MYMATH_H__

 2 #define __MYMATH_H__

 4 double my_pi(void);

 6 #endif

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ vim src/mymathfun.c

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ cat -n src/mymathfun.c 

 2 double my_pi(void)

 4 return 3.14159;

 5 }

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ mkdir lib 

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ gcc -o obj/mymathfun.o -c src/mymathfun.c 

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ ar rcs lib/libmymathfun.a obj/mymathfun.o 

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ ls lib/

libmymathfun.a

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ 

或者


wu_being@UbuntuKylin1704:~/Code/C/lib_test$ 

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ ar rcs lib/libmymathfun.a src/mymathfun.c

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ ls lib/

libmymathfun.a

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ 


gcc -o 调用者的目标文件.o -c 调用者的C源文件.c

gcc -o 可执行文件 调用者的目标文件.o -Ldir -l库文件名

-lname:表示库目录的库文件libname.a或libname.so。如果库文件不是以lib开头,如hello.a,只能用用hello.a,不能用-lhello。 删除静态库文件不会影响到可执行文件的运行。 2-3-2 静态库使用的例子
wu_being@UbuntuKylin1704:~/Code/C/lib_test$ gcc -o bin/mymathfun_test src/mymath_test.c -Iinclude -Llib -lmymathfun

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ ./bin/mymathfun_test 

My Pi: 3.141590

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ 

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ 

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ gcc -o obj/mymath_test.o -c src/mymath_test.c -Iinclude

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ gcc -o bin/mymathfun_test obj/mymath_test.o -Iinclude -Llib -lmymathfun

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ ./bin/mymathfun_test 

My Pi: 3.141590

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ 


共享库即动态链接库,在linux中以.so(share object)为后缀,在windows中以.dll为后缀。程序开始启动运行时,加载所需的函数,程序运行时也需要共享库的支持。共享库链接出来的文件比静态库要小得多。Linux中所有标准的共享库存放在/usr/lib目录中。


wu_being@UbuntuKylin1704:~/Code/C/lib_test$

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ gcc -o obj/mymathfun.o -c src/mymathfun.c 

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ gcc -shared -fPCI -o lib/libmymathfun2.so obj/mymathfun.o 

gcc: error: unrecognized command line option ‘-fPCI’; did you mean ‘-fPIC’?

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ gcc -shared -fPIC -o lib/libmymathfun2.so obj/mymathfun.o 

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ gcc -shared -fpic -o lib/libmymathfun2.so obj/mymathfun.o 

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ gcc -shared -fPCI -o lib/libmymathfun2.so obj/mymathfun.o 

gcc: error: unrecognized command line option ‘-fPCI’; did you mean ‘-fPIC’?

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ 

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ ls lib/

libmymathfun.a libmymathfun2.so

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ ls lib/ -l

总用量 12

-rw-r--r-- 1 wu_being wu_being 1684 10月 24 17:31 libmymathfun.a

-rwxr-xr-x 1 wu_being wu_being 8152 10月 24 20:59 libmymathfun2.so

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ 


gcc -o 调用者的目标文件.o -c 调用者的C源文件.c

gcc -o 可执行文件 调用者的目标文件.o -Ldir -l库文件名

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ 

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ gcc -shared -fPIC -o lib/libmymathfun2.so src/mymathfun.c

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ gcc -o bin/mymathfun_test2 src/mymath_test.c -Iinclude -Llib -lmymathfun2

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ ./bin/mymathfun_test2 

./bin/mymathfun_test2: error while loading shared libraries: libmymathfun2.so: cannot open shared object file: No such file or directory

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ 

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ sudo mv lib/libmymathfun2.so /usr/lib/

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ ./bin/mymathfun_test2 

My Pi: 3.141590

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ 


wu_being@UbuntuKylin1704:~/Code/C/lib_test$ 

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ sudo rm -rf /usr/lib/libmymathfun2.so 

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ ls lib/

libmymathfun.a

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ gcc -shared -fPIC -o lib/libmymathfun2.so obj/mymathfun.o 

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ ls lib/

libmymathfun2.so libmymathfun.a

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ gcc -o bin/mymathfun_test2 -Iinclude src/mymath_test.c -Llib -lmymathfun2

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ ./bin/mymathfun_test2 

./bin/mymathfun_test2: error while loading shared libraries: libmymathfun2.so: cannot open shared object file: No such file or directory

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ 

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ export LD_LIBRARY_PATH=lib

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ ./bin/mymathfun_test2 

My Pi: 3.141590

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ echo $LD_LIBRARY_PATH 

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ 


wu_being@UbuntuKylin1704:~/Code/C/lib_test$ ls lib/

libmymathfun2.so libmymathfun.a

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ rm lib/libmymathfun2.so 

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ ls lib/

libmymathfun.a

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ ./bin/mymathfun_test2 

./bin/mymathfun_test2: error while loading shared libraries: libmymathfun2.so: cannot open shared object file: No such file or directory

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ 


wu_being@UbuntuKylin1704:~/Code/C/test_cpp$ 

wu_being@UbuntuKylin1704:~/Code/C/test_cpp$ ls

mymathfun.c mymath.h mymath_test.c

wu_being@UbuntuKylin1704:~/Code/C/test_cpp$ cat -n mymath_test.c 

 1 #include stdio.h 

 2 #include "mymath.h"

 4 int main()

 6 printf("My Pi: %lf\n", my_pi());

 7 return 0;

wu_being@UbuntuKylin1704:~/Code/C/test_cpp$ gcc mymath_test.c 

/tmp/ccRCzDfw.o:在函数‘main’中:

mymath_test.c:(.text+0x5):对‘my_pi’未定义的引用

collect2: error: ld returned 1 exit status

wu_being@UbuntuKylin1704:~/Code/C/test_cpp$ gcc mymath_test.c mymathfun.c 

wu_being@UbuntuKylin1704:~/Code/C/test_cpp$ ./a.out 

My Pi: 3.141593

wu_being@UbuntuKylin1704:~/Code/C/test_cpp$ 

wu_being@UbuntuKylin1704:~/Code/C/test_cpp$ vim mymath_test.c 

wu_being@UbuntuKylin1704:~/Code/C/test_cpp$ cat -n mymath_test.c 

 1 #include stdio.h 

 2 #include "mymath.h"

 3 #include "mymathfun.c"

 5 int main()

 7 printf("My Pi: %lf\n", my_pi());

 8 return 0;

wu_being@UbuntuKylin1704:~/Code/C/test_cpp$ gcc mymath_test.c 

wu_being@UbuntuKylin1704:~/Code/C/test_cpp$ ./a.out 

My Pi: 3.141593

wu_being@UbuntuKylin1704:~/Code/C/test_cpp$ gcc mymath_test.c mymathfun.c 

/tmp/ccMnE10S.o:在函数‘my_pi’中:

mymathfun.c:(.text+0x0): `my_pi被多次定义

/tmp/cc89I2rk.o:mymath_test.c:(.text+0x0):第一次在此定义

collect2: error: ld returned 1 exit status

wu_being@UbuntuKylin1704:~/Code/C/test_cpp$ 

test2


wu_being@UbuntuKylin1704:~/Code/C/lib_test$ 

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ gcc -o bin/mymathfun_test src/mymath_test.c src/mymathfun.c 

src/mymath_test.c:2:20: fatal error: mymath.h: 没有那个文件或目录

 #include "mymath.h"

compilation terminated.

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ gcc -o bin/mymathfun_test src/mymath_test.c src/mymathfun.c -Iinclude

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ ./bin/mymathfun_test 

My Pi: 3.141590

wu_being@UbuntuKylin1704:~/Code/C/lib_test$ 

Wu_Being博客声明:本人博客欢迎转载,请标明博客原文和原链接!谢谢!
《C语言的静态库与共享库》: http://blog.csdn.net/u014134180/article/details/78335274

Wu_Being 吴兵博客接受赞助费二维码

如果你看完这篇博文,觉得对你有帮助,并且愿意付赞助费,那么我会更有动力写下去。


面向对象的程序设计C++课堂复盘总结 C语言复习+C++基础语法 Stay Hungry,Stay Foolish. 任何人都能写出机器能看懂的代码,但只有优秀的程序员才能写出人能看懂的代码。 有两种写程序的方式:一种是把代码写得非常复杂,以至于 “看不出明显的错误”;另一种是把代码写得非常简单,以至于 “明显看不出错误”。 “把正确的代码改快速”,要比 “把快速的代码改正确”,容易得太多。 C++ 庞大、复杂是无法改变的事实,所以我们要把这三条格言铭记在心,对它保持一颗 “敬畏” 的心,在学习语言特性的同时,千万不要滥用特性,谦虚谨慎,戒骄戒躁。 -------CSDN Albert Edison
C语言总结(第2章算法——程序的灵魂 第3章最简单的C程序设计——顺序程序设计 第4章选择结构程序设计) 算法(algorithm)是解决一系列问题的清晰指令,也就是,能对一定规范的输入,在有限的时间内获得所要求的输出。 6是解决做什么和怎么做的问题。简单来说,算法就是解决一个问题的具体方法和步骤。算法是程序的灵魂。
C语言程序设计第五版 谭浩强 P107 3,4,6,8,9题解 1)3+4 5 优先3+4得到结果7,因此7 5结果为真; 4==5为假,一真一假逻辑与最终结果为假。结果为0 (2)优先算术运算4+5得到7,非0则为真,4-5得到-1,非0则为真,||和 优先级最低,自左向右运算,3||7结果为1,1 -1结果为1,一真一假逻辑与最终结果为假。结果为1
【C语言进阶】C语言程序设计:动态通讯录(顺序表实现) 动态通讯录的实现 一、实验的目的和意义 二、实验内容描述 三、功能描述 四、数据结构 1、三大模块 2、结构设计 3、动态开辟 4、文件操作 5、主要函数 五、流程图及模块算法 1.Contacct 程序运行流程图 2、AddContct(增加)函数流程图 3、DelContct(删除)函数流程图 4、SearchContct(查找)函数流程图 5、ModifyContct(修改)函数流程图 6、SortContct(排序)函数流程图 六、实验测试结果 七、实验总结 八、源代码 1、DynamicContact.h 2、DynamicC
wu_being 上海市 华东师范大学 软件工程 (非全日制硕士研究生) 网名:Wu_Being,吴兵 代码:!1