C语言(静态链接库和动态链接库)
7.自己制作静态链接库并使用
(1)第一步:自己制作静态链接库
首先使用gcc -c只编译不连接,生成.o文件;然后使用ar工具进行打包成.a归档文件
库名不能随便乱起,一般是lib+库名称,后缀名是.a表示是一个归档文件
注意:制作出来了静态库之后,发布时需要发布.a文件和.h文件。
(2)第二步:使用静态链接库
把.a和.h都放在我引用的文件夹下,然后在.c文件中包含库的.h,然后直接使用库函数。
第一次,编译方法:gcc test.c -o test
报错信息:test.c:(.text+0xa): undefined reference to func1' test.c:(.text+0x1e): undefined reference to
func2’
第二次,编译方法:gcc test.c -o test -laston
报错信息:/usr/bin/ld: cannot find -laston
collect2: error: ld returned 1 exit status
第三次,编译方法:gcc test.c -o test -laston -L.
无报错,生成test,执行正确。
(3)除了ar名另外,还有个nm命令也很有用,它可以用来查看一个.a文件中都有哪些符号
8.自己制作动态链接库并使用
(1)动态链接库的后缀名是.so(对应windows系统中的dll),静态库的扩展名是.a
(2)第一步:创建一个动态链接库。
gcc aston.c -o aston.o -c -fPIC
gcc -o libaston.so aston.o -shared
-fPIC是位置无关码,-shared是按照共享库的方式来链接。
注意:做库的人给用库的人发布库时,发布libxxx.so和xxx.h即可。
(3)第二步:使用自己创建的共享库。
第一步,编译方法:gcc test.c -o test
报错信息:test.c:(.text+0xa): undefined reference to func1' test.c:(.text+0x1e): undefined reference to
func2’
collect2: error: ld returned 1 exit status
第二步,编译方法:gcc test.c -o test -laston
报错信息:/usr/bin/ld: cannot find -laston
collect2: error: ld returned 1 exit status
第三步,编译方法:gcc test.c -o test -laston -L.
编译成功
但是运行出错,报错信息:
error while loading shared libraries: libaston.so: cannot open shared object file: No such file or directory
错误原因:动态链接库运行时需要被加载(运行时环境在执行test程序的时候发现他动态链接了libaston.so,于是乎会去固定目录尝试加载libaston.so,如果加载失败则会打印以上错误信息。)
解决方法一:
将libaston.so放到固定目录下就可以了,这个固定目录一般是/usr/lib目录。
cp libaston.so /usr/lib即可
解决方法二:使用环境变量LD_LIBRARY_PATH。操作系统在加载固定目录/usr/lib之前,会先去LD_LIBRARY_PATH这个环境变量所指定的目录下去寻找,如果找到就不用去/usr/lib下面找了,如果没找到再去/usr/lib下面找。所以解决方案就是将libaston.so所在的目录导出到环境变量LD_LIBRARY_PATH中即可。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/mnt/hgfs/Winshare/s5pv210/AdvancedC/4.6.PreprocessFunction/4.6.12.sharedobject.c/sotest
在ubuntu中还有个解决方案三,用ldconfig
(4)ldd命令:作用是可以在一个使用了共享库的程序执行之前解析出这个程序使用了哪些共享库,并且查看这些共享库是否能被找到,能被解析(决定这个程序是否能正确执行)。
C语言(静态链接库和动态链接库)相关推荐
- C语言静态链接库和动态链接库讲解及制作使用
C语言静态链接库和动态链接库讲解及制作使用 1. 引言 静态链接库和动态库均为函数库 函数库:不是C语言的一部分,是一些事先写好的函数的集合,给别人复用 就像scanf和printf函数一样,通过#i ...
- Linux环境下c语言静态链接库和动态链接库创建和使用
库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀. 面对比一下两者: 静态链接库:当要使用时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以一旦连接成功, ...
- c语言库文件是dll还是lib,C语言之静态链接库与动态链接库(2)
我们发现,无论是静态链接库还是动态链接库,最后都有lib文件,那么两者区别是什么呢? 其实,两个是完全不一样的东西.静态库对应的lib文件叫静态库,动态库对应的lib文件叫导入库.实际上静态库本身就包 ...
- cnsl是什么意思_VS2010下创建静态链接库和动态链接库
VS2010下创建静态链接库和动态链接库 类封装成dll如果你的工作长期与某个领域相关,比如说长期做直接体绘制 (DVR)方面的开发,那么你可能经常使用自己的传递函数类,如果每一个工程你都把传递函数类 ...
- C++ 创建静态链接库和动态链接库
上篇文章演示了如何使用C++ 编译的静态链接库和动态链接库,本篇文章主要介绍如何创建静态链接库和动态链接库,本文使用的工具是visual studio 2019 企业版,需要安装对应的C++sdk,可 ...
- 静态链接库与动态链接库区别
一. 静态链接库与动态链接库区别 静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了.但是若使 ...
- 静态链接库与动态链接库详解
以下内容源于C语言中文网相关内容的学习整理,如有侵权请告知删除. 一.库文件的简介 库文件,其等价为压缩包文件.该文件内部通常包含不止一个目标文件(也就是二进制文件),每个目标文件存储的代码,并非完整 ...
- 静态链接库、动态链接库使用方法
总结一下动态链接库和静态链接库.1 首先搞清楚几个概念: 静态库:函数和数据被编译进一个二进制文件,通常扩展名为.lib.在使用静态库的情况下,在编译连接可执行文件时,链接器从库中复制这些函数和数据并 ...
- 静态链接库,动态链接库【滴水逆向三期48笔记】
在开发过程中,我们通常会有很多函数,需要多次使用或在不同的程序中使用该函数,也有可能我们会将我们写好的函数给别人使用,但是我们又不想给他源代码,毕竟代码是我们花了很多功夫写出来的,那么我们如何不发给其 ...
- 静态链接库与动态链接库 (二)动态链接库的编译与使用
上一篇文章里大概描述linux下静态链接库的编译与使用,下面讲动态链接库的编译与使用方法. 1. 什么是动态链接库 所谓动态链接库,是指编译的时候不会把程序引用到的库插入到执行程序里,而是在执行时候才 ...
最新文章
- 一份火爆国外的PyCharm快捷键和Python代码速查表
- Java+大数据开发——Hadoop集群环境搭建(二)
- cocos2dx build_native.sh clean 命令报错的解决
- Tesseract-ocr 3.0.2源码 + VS2010项目工程 + 简单测试代码
- osgi:install_OSGi服务测试助手:ServiceRegistrationRule
- 各种数据库获取前10行记录实例
- 海底捞:今年年底前将关停约300家经营未达预期门店
- 图灵机概念的javascript演示
- 报错:error while loading shared libraries: libz.so.1: cannot open shared object file
- Python读取一个文件并删除换行输出到另外一个文件中
- Vue指令(二)--数组的变动
- mysql无法远程连接 111_如何解决远程连接mysql出现Can't connect to MySQL server on (111 Connection refused)的问题...
- cin java_java基础语法
- Multisim14简介与安装
- Linux之sqlite3使用
- table表格标签css固定最后一列方案
- python学英语库_交流学英语的经验-js焦点图怎么写-WinFrom控件库|.net开源控件库|HZHControls官网...
- 【背包问题】基于matlab禁忌搜索算法求解背包问题【含Matlab源码 373期】
- 懒,不想登录Cisco Packet Tracer 7.3怎么办?
- 自行实现 Onvif 对接开发模式