Linux下静态库、动态库的创建与调用
2021/11/27 7:10:28
本文主要是介绍Linux下静态库、动态库的创建与调用,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
一、前言
在项目开发时,经常会用到第三方库,也会自己创建动态库给别人或者给自己其他的工程项目使用。
- 库的类型分为
动态库
、静态库
。 - 在Linux下动态库的后缀为
.so
,静态库的后缀为.lib
。 - 动态库称为共享库. 程序在编译的时需要、运行的时候也需。
- 静态库在编译的时候抽取需要使用的函数进行编译、运行的时候不需要库。
- 静态编译的程序比动态库链接占用空间更加大。
二、动态库的创建与使用案例
2.1 创建动态库
创建动态库的语法格式: gcc -fPIC -shared -o <库文件名称>.so 源文件名称.c <库文件名称>如何命名? libxxx.so 更改的地方xxx 源文件名称.c 可以是多个. 例如: [wbyq@wbyq sum]$ ls sum.c sum.h [wbyq@wbyq sum]$ gcc -fPIC -shared -o libsum.so sum.c [wbyq@wbyq sum]$ ls libsum.so sum.c sum.h
2.2 gcc编译时常用的语法选项
gcc <源文件> [选项参数] 常用的选项参数介绍: -o <outfile> 指定编译之后生成的可执行文件名称 -c 表示生成.o文件 -I <path> 指定编译时搜索头文件的路径。可以指定多个头文件路径。 例如: gcc 123.c -I/work -I/home ... -L <path> 指定编译时搜索库文件的路径。可以指定多个库文件路径。 例如: gcc 123.c -L/wor/lib -L/home/lib ... -l <name> 指定编译时使用的库文件名称. 可以指定对个库文件名称. 如果我们使用的库文件名称是 libabc.so libsum.so 用法例如: gcc 123.c -labc -lsum
2.3 编译时如何指定库文件和头文件?
[wbyq@wbyq linux_c]$ ls a.out app app.c app.o sum [wbyq@wbyq linux_c]$ [wbyq@wbyq linux_c]$ gcc app.c app.c:3:17: 错误:sum.h:没有那个文件或目录 [wbyq@wbyq linux_c]$ gcc app.c -I sum/ /tmp/ccCNE8sV.o: In function `main': app.c:(.text+0x5a): undefined reference to `sum_val' collect2: ld 返回 1 [wbyq@wbyq linux_c]$ gcc app.c -I sum/ -L sum/ /tmp/cccXsHyA.o: In function `main': app.c:(.text+0x5a): undefined reference to `sum_val' collect2: ld 返回 1 [wbyq@wbyq linux_c]$ gcc app.c -I sum/ -L sum/ -lsum
2.4 如何解决运行时找不到动态库的问题?
说明: 默认情况下系统搜索动态库的路径是/lib 、 /usr/lib
方法1: 直接将动态库拷贝到/lib 或者 /usr/lib 目录下。
[wbyq@wbyq linux_c]$ ./a.out ./a.out: error while loading shared libraries: libsum.so: cannot open shared object file: No such file or directory [wbyq@wbyq linux_c]$ sudo cp sum/libsum.so /lib/ [sudo] password for wbyq: [wbyq@wbyq linux_c]$ ./a.out ./a.out <int> <int> [wbyq@wbyq linux_c]$ ./a.out 123 456 c=579 [wbyq@wbyq linux_c]$
方式2: 设置环境变量
[wbyq@wbyq sum]$ ls libsum.so sum.c sum.h [wbyq@wbyq sum]$ pwd /mnt/hgfs/linux-share-dir/linux_c/sum [wbyq@wbyq sum]$ cd .. [wbyq@wbyq linux_c]$ ls a.out app app.c app.o sum [wbyq@wbyq linux_c]$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/mnt/hgfs/linux-share-dir/linux_c/sum [wbyq@wbyq linux_c]$ ./a.out ./a.out <int> <int>
三、静态库创建与使用
3.1 创建静态库
注意: 动态库如果静态库名字重名的时候,编译器优先使用动态库.
静态库的命名规则: libxxx.a
创建静态库的流程:
- 先将.c源文件编译成.o文件
gcc xxx.c xxx.c xxx.c ... -c 例如: gcc sum.c -c
- 在将.o文件打包成静态库文件.
ar crv libxxx.a xxx.o xxx.o .... 例如: ar crv libmylib.a my_print.o my_math.o
3.2 如何使用静态库
[wbyq@wbyq linux_c]$ cd sum/ [wbyq@wbyq sum]$ ls sum.c sum.h [wbyq@wbyq sum]$ gcc sum.c -c [wbyq@wbyq sum]$ ar crv libsum.a sum.o a - sum.o [wbyq@wbyq sum]$ ls libsum.a sum.c sum.h sum.o [wbyq@wbyq sum]$ cd .. [wbyq@wbyq linux_c]$ ls app.c sum [wbyq@wbyq linux_c]$ gcc app.c -I sum/ -L sum/ -lsum [wbyq@wbyq linux_c]$ ./a.out ./a.out <int> <int>
这篇关于Linux下静态库、动态库的创建与调用的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-12如何创建可引导的 ESXi USB 安装介质 (macOS, Linux, Windows)
- 2024-11-08linux的 vi编辑器中搜索关键字有哪些常用的命令和技巧?-icode9专业技术文章分享
- 2024-11-08在 Linux 的 vi 或 vim 编辑器中什么命令可以直接跳到文件的结尾?-icode9专业技术文章分享
- 2024-10-22原生鸿蒙操作系统HarmonyOS NEXT(HarmonyOS 5)正式发布
- 2024-10-18操作系统入门教程:新手必看的基本操作指南
- 2024-10-18初学者必看:操作系统入门全攻略
- 2024-10-17操作系统入门教程:轻松掌握操作系统基础知识
- 2024-09-11Linux部署Scrapy学习:入门级指南
- 2024-09-11Linux部署Scrapy:入门级指南
- 2024-08-21【Linux】分区向左扩容的方法