C语言的静态库与共享库
来源:互联网 发布:海关10月进出口数据 编辑:程序博客网 时间:2024/05/18 03:48
- 1库的概念
- 2静态库
- 2-1 静态库的概念
- 2-2 静态库的创建
- 2-2-1 静态库创建的命令
- 2-2-2 静态库创建的准备工作
- 2-2-3 创建静态库的例子
- 2-3 静态库的使用
- 2-3-1 静态库使用的命令
- 2-3-2 静态库使用的例子
- 3共享库动态链接库
- 3-1 共享库的概念
- 3-2 共享库的创建
- 3-2-1 共享库的创建命令
- 3-2-2 共享库的创建例子
- 3-3 共享库的使用
- 3-3-1 共享库的使用命令
- 3-3-2 共享库的使用例子
- 4不使用库的方法
1、库的概念
函数库是由系统建立的且有一定功能的函数集合。库中存放函数的名称和对应的目标代码,以及连接过程中所需的重定位信息,但是库中对应的函数的源代码一般是不可见的,而对应的头文件中可以看到它的对外接口(函数原型)。
Linux中标准的C函数库放置在/usr/lib
下,以文件形式存放。用户也可以根据自己的所需建立自己的用户函数库。函数库分为静态库(.a)和共享库(.so,ShareObj),共享库在windows环境也叫动态链接库(.dll)。
2、静态库
2-1 静态库的概念
静态库是一些.o目标文件的集合,一般以.a形式结尾。静态库在程序链接阶段使用,链接器将程序要用到的函数从库中提取出来,并整合到程序中,程序运行不再使用静态库了。由于每个程序要用到函数都从库提取并整合在一起,所以可执行文件夹会比较大。
2-2 静态库的创建
2-2-1 静态库创建的命令
ar rcs lib库文件名.a 目标文件1 目标文件2 ... 目标文件n
r
:表示将.o目标文件加入到静态库中;c
:表示创建静态库;s
:表示生产索引;
2-2-2 静态库创建的准备工作
wu_being@UbuntuKylin1704:~/Code/C$ mkdir lib_testwu_being@UbuntuKylin1704:~/Code/C$ cd lib_test/wu_being@UbuntuKylin1704:~/Code/C/lib_test$ lwu_being@UbuntuKylin1704:~/Code/C/lib_test$ mkdir bin include obj srcwu_being@UbuntuKylin1704:~/Code/C/lib_test$ lbin/ include/ obj/ src/wu_being@UbuntuKylin1704:~/Code/C/lib_test$ vim src/mymath_test.cwu_being@UbuntuKylin1704:~/Code/C/lib_test$ cat -n src/mymath_test.c 1 #include <stdio.h> 2 #include "mymath.h" 3 4 int main() 5 { 6 printf("My Pi: %lf"\n, my_pi()); 7 return 0; 8 } 9 wu_being@UbuntuKylin1704:~/Code/C/lib_test$ vim include/mymath.hwu_being@UbuntuKylin1704:~/Code/C/lib_test$ cat -n include/mymath.h 1 #ifndef __MYMATH_H__ 2 #define __MYMATH_H__ 3 4 double my_pi(void); 5 6 #endifwu_being@UbuntuKylin1704:~/Code/C/lib_test$ vim src/mymathfun.cwu_being@UbuntuKylin1704:~/Code/C/lib_test$ cat -n src/mymathfun.c 1 2 double my_pi(void) 3 { 4 return 3.14159; 5 }
2-2-3 创建静态库的例子
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.awu_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.cwu_being@UbuntuKylin1704:~/Code/C/lib_test$ ls lib/libmymathfun.awu_being@UbuntuKylin1704:~/Code/C/lib_test$
2-3 静态库的使用
2-3-1 静态库使用的命令
gcc -o 可执行文件 调用者的C源文件.c -Ldir -l库文件名
或者
gcc -o 调用者的目标文件.o -c 调用者的C源文件.cgcc -o 可执行文件 调用者的目标文件.o -Ldir -l库文件名
-Ldir
:表示指定库文件所在的路径中,默认在库路径在/usr/lib
目录下;-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 -lmymathfunwu_being@UbuntuKylin1704:~/Code/C/lib_test$ ./bin/mymathfun_test My Pi: 3.141590wu_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 -Iincludewu_being@UbuntuKylin1704:~/Code/C/lib_test$ gcc -o bin/mymathfun_test obj/mymath_test.o -Iinclude -Llib -lmymathfunwu_being@UbuntuKylin1704:~/Code/C/lib_test$ ./bin/mymathfun_test My Pi: 3.141590wu_being@UbuntuKylin1704:~/Code/C/lib_test$
3、共享库(动态链接库)
3-1 共享库的概念
共享库即动态链接库,在linux中以.so(share object)为后缀,在windows中以.dll为后缀。程序开始启动运行时,加载所需的函数,程序运行时也需要共享库的支持。共享库链接出来的文件比静态库要小得多。Linux中所有标准的共享库存放在/usr/lib
目录中。
3-2 共享库的创建
3-2-1 共享库的创建命令
gcc -shared -fPCI -o lib库文件名.so 目标文件1,目标文件2,...,目标文件n
-shared
:表示要创建共享库;-fpci或-fPCI
:表示创建产生独立目标代码,具体应用取决于平台;
3-2-2 共享库的创建例子
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.sowu_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.sowu_being@UbuntuKylin1704:~/Code/C/lib_test$
3-3 共享库的使用
3-3-1 共享库的使用命令
gcc -o 可执行文件 调用者的C源文件.c -Ldir -l库文件名
或者
gcc -o 调用者的目标文件.o -c 调用者的C源文件.cgcc -o 可执行文件 调用者的目标文件.o -Ldir -l库文件名
- 运行可执行文件提示找汪以库文件的解决方案
sudo cp libmymathfun2.so /usr/lib
export LD_LIBRARY_PATH=库文件目录
- 删除静态库文件会影响到可执行文件的运行!(提示找不到库文件)
3-3-2 共享库的使用例子
wu_being@UbuntuKylin1704:~/Code/C/lib_test$ wu_being@UbuntuKylin1704:~/Code/C/lib_test$ gcc -shared -fPIC -o lib/libmymathfun2.so src/mymathfun.cwu_being@UbuntuKylin1704:~/Code/C/lib_test$ gcc -o bin/mymathfun_test2 src/mymath_test.c -Iinclude -Llib -lmymathfun2wu_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 directorywu_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.141590wu_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.awu_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.awu_being@UbuntuKylin1704:~/Code/C/lib_test$ gcc -o bin/mymathfun_test2 -Iinclude src/mymath_test.c -Llib -lmymathfun2wu_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 directorywu_being@UbuntuKylin1704:~/Code/C/lib_test$ wu_being@UbuntuKylin1704:~/Code/C/lib_test$ export LD_LIBRARY_PATH=libwu_being@UbuntuKylin1704:~/Code/C/lib_test$ ./bin/mymathfun_test2 My Pi: 3.141590wu_being@UbuntuKylin1704:~/Code/C/lib_test$ echo $LD_LIBRARY_PATH libwu_being@UbuntuKylin1704:~/Code/C/lib_test$
wu_being@UbuntuKylin1704:~/Code/C/lib_test$ ls lib/libmymathfun2.so libmymathfun.awu_being@UbuntuKylin1704:~/Code/C/lib_test$ rm lib/libmymathfun2.so wu_being@UbuntuKylin1704:~/Code/C/lib_test$ ls lib/libmymathfun.awu_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 directorywu_being@UbuntuKylin1704:~/Code/C/lib_test$
4、不使用库的方法
test1
wu_being@UbuntuKylin1704:~/Code/C/test_cpp$ wu_being@UbuntuKylin1704:~/Code/C/test_cpp$ lsmymathfun.c mymath.h mymath_test.cwu_being@UbuntuKylin1704:~/Code/C/test_cpp$ cat -n mymath_test.c 1 #include <stdio.h> 2 #include "mymath.h" 3 4 int main() 5 { 6 printf("My Pi: %lf\n", my_pi()); 7 return 0; 8 } 9 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 statuswu_being@UbuntuKylin1704:~/Code/C/test_cpp$ gcc mymath_test.c mymathfun.c wu_being@UbuntuKylin1704:~/Code/C/test_cpp$ ./a.out My Pi: 3.141593wu_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" 4 5 int main() 6 { 7 printf("My Pi: %lf\n", my_pi()); 8 return 0; 9 } 10 wu_being@UbuntuKylin1704:~/Code/C/test_cpp$ gcc mymath_test.c wu_being@UbuntuKylin1704:~/Code/C/test_cpp$ ./a.out My Pi: 3.141593wu_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 statuswu_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 -Iincludewu_being@UbuntuKylin1704:~/Code/C/lib_test$ ./bin/mymathfun_test My Pi: 3.141590wu_being@UbuntuKylin1704:~/Code/C/lib_test$
Wu_Being博客声明:本人博客欢迎转载,请标明博客原文和原链接!谢谢!
《C语言的静态库与共享库》: http://blog.csdn.net/u014134180/article/details/78335274
如果你看完这篇博文,觉得对你有帮助,并且愿意付赞助费,那么我会更有动力写下去。
阅读全文
0 0
- C语言的静态库与共享库
- c语言共享代码之静态库与动态库
- linux C复习:静态库与共享库的区别
- C语言库——静态库、共享库
- C语言库——静态库、共享库
- C语言库——静态库、共享库
- C语言库——静态库、共享库
- linux下的C语言共享库和静态库的创建和使用
- c语言:静态库与动态库
- 静态库与共享库
- 静态库与共享库
- 静态库与共享库
- 静态库与共享库
- 静态库与共享库
- 静态库与共享库
- C语言共享库的制作
- C语言共享库的制作
- liunx C 静态库、共享库的生成和使用
- 6. ZigZag Conversion leetcode
- Windows编程基础--第8节 MFC对话框控件访问的七种方法(上)
- 01-面向对象(接口的应用)1 01-面向对象(接口的应用)2 01-面向对象(接口的应用)3
- 二分法做平方根
- java 之 静态泛型方法
- C语言的静态库与共享库
- Note-WebAPI
- 【JZOJ 5413】【NOIP2017提高A组集训10.22】清兰
- Hibernate_day02
- java 模拟terminal通过docker remote api连接docker容器
- js-数组排序及去重
- CORS 使用详解 + 例子
- 134. Gas Station
- java多线程系列(二)---synchronized同步代码块