静态链接库与动态链接库 (二)动态链接库的编译与使用
上一篇文章里大概描述linux下静态链接库的编译与使用,下面讲动态链接库的编译与使用方法。
1. 什么是动态链接库
所谓动态链接库,是指编译的时候不会把程序引用到的库插入到执行程序里,而是在执行时候才会去加载相关的库,所有用到此库的程序可以共享一份代码。
这样带来的好处是可执行程序所占的空间变小了,同时,如果库需要升级,你并不需要重新编译你的程序,只要把相关的库升级即可。
2. 动态链接库的编译与使用方法
使用和上一篇文章相同的代码:main.c sum.c sum.h
在 linux 下动态链接库文件一般是这样的名字: libxxx.so
复制代码lv@lenovo: $ ls main.c sum.c sum.h lv@lenovo: $ lv@lenovo: $ gcc -c -fPIC sum.c ## -fIPC告诉编译器将源代码编译成共享的object文件,PIC(Position-Independent Code)意思是非位置依赖性代码 lv@lenovo: $ ls main.c sum.c sum.h sum.o lv@lenovo: $ gcc -shared -fPIC -o libsum.so sum.o ## 生成动态链接库文件libsum.so lv@lenovo: $ ls libsum.so main.c sum.c sum.h sum.o lv@lenovo: $ lv@lenovo: $ gcc -o sumappd main.c -L . -lsum ## 生成可执行程序 lv@lenovo: $ ls libsum.so sum.c sum.o main.c sum.h sumappd lv@lenovo: $ ./sumappd ## 运行生成结果 Num1 + Num2 = 3
结论: 编译时”-lsum“的方式,是不能够区分当前是静态链接还是动态链接的。
如果在同一个目录下同时有静态链接库和动态链接库,则系统默认会引用动态链接库,如果想使用静态链接库则需要在编译时加上”-static“参数。
(注:若使用C++编写,编译的时候将 gcc 改用 g++ 即可)
转载于:https://www.cnblogs.com/lvchaoshun/p/5966788.html
静态链接库与动态链接库 (二)动态链接库的编译与使用相关推荐
- 制作静态链接库和动态链接库
自己制作静态链接库 首先使用gcc -c只编译不连接,生成.o文件,然后使用ar工具进行打包成.a归档文件. 1.1 建立一个源文件和头文件 .C文件: #include <stdio.h> ...
- 静态链接库,动态链接库【滴水逆向三期48笔记】
在开发过程中,我们通常会有很多函数,需要多次使用或在不同的程序中使用该函数,也有可能我们会将我们写好的函数给别人使用,但是我们又不想给他源代码,毕竟代码是我们花了很多功夫写出来的,那么我们如何不发给其 ...
- MFC模块的动态链接库DLL以及静态链接库LIB编译后的调用
静态链接库LIB和动态链接库DLL的区别,创建和示例 1.什么是静态连接库,什么是动态链接库 静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都 ...
- 动态链接库.so和静态链接库.a的区别
静态链接库: •扩展名:.a •编译行为:在编译的时候,将函数库直接整合到执行程序中(所以利用静态库编译生成的文档会更大) •独立执行的状态:编译成功的可执行文件可以独立运行,不需要再向外部 ...
- GCC 编译 C(C++)静态链接库(gcc -L、gcc -l)和动态链接库(gcc -fPIC -shared)的创建和使用
1. 库文件 所谓库文件,读者可以将其等价为压缩包文件,该文件内部通常包含不止一个目标文件(也就是二进制文件). 值得一提的是,库文件中每个目标文件存储的代码,并非完整的程序,而是一个个实用的功能模块 ...
- C语言函数库:动态链接库与静态链接库
首先,函数库就是一些事先写好的函数的集合,是别人分享的,我们可以拿来使用的.经过一些校准和整理,就形成一份标准化的函数库.例如glibc 函数库有两种提供形式:动态链接库与静态链接库 早起函数库里的函 ...
- KEIL 创建静态链接库+ 调用自己创建的静态链接库
1.为什么要创建静态链接库? 当公司或者个人需要提供自己的编写的代码供他人调用时,而你或提供方并不想提供源代码(.c源代码),只想提供头文件.h(在头文件中申明函数)供他人调用,他人在调用时只需要知道 ...
- 【转载】linux静态链接库与动态链接库的区别及动态库的创建
这篇文章对于动态库的概念及使用介绍的很不错,故收藏了. 一.引言 通常情况下,对函数库的链接是放在编译时期(compile time)完成的.所有相关的对象文件(object file)与牵涉到的函数 ...
- Linux环境下c语言静态链接库和动态链接库创建和使用
库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀. 面对比一下两者: 静态链接库:当要使用时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以一旦连接成功, ...
最新文章
- 模拟键盘输入的keycode
- python返回错误提示_python 错误处理
- 在Tableau中实现表格下钻
- 机器学习之支持向量机
- Hadoop完全分子式环境搭建—问题及解决办法
- mysql 命令行 主从复制_MySQL 的主从复制(高级篇)
- java后台面试题整理
- libreoffice使用_使用LibreOffice Calc管理您的财务
- arm b bl 地址无关码_海边同居有甜有虐,又一部BL日剧来了
- PYTHON_错误处理
- (译)iOS Code Signing: 解惑
- vscode自动整理代码_再见了, VS Code!
- 2022春山东大学人工智能导论期末题库附答案
- 计算平均指令时间_欧姆龙PLC指令应用案例(问答解析)
- TouchDesigner处理串口数据
- Function eregi is deprecated (解决方法)
- 团队项目开发“编码规范”之九:代码分析
- GIS是个什么鬼,真的开眼了。感谢好学生的奉献。
- Python的并发并行[1] - 线程[3] - 多线程的同步控制
- vue详解(一)概述和基础语法
热门文章
- windows nodejs mysql_windows server 安装 mysql + nondejs连接mysql
- linux 安装redis4.0.6,Redis(4.0.6)在Linux(CentOS7)下的安装
- 控制显示隐藏_大众发动机控制单元隐藏功能刷写
- python excel操作单元格_python 操作excel表格的方法
- 用什么擦地最干净脑筋急转弯_22个数学脑筋急转弯答案,你能全部做出来吗?...
- 500个普通人名_2020年世界500强汽车行业排名:大众公司第一,丰田汽车公司第二...
- mysql数据库解压安装教程_MySQL数据库之windows 10下解压版MySql安装配置方法教程...
- java 获取utc,如何在Java 8中获取UTC + 0日期?
- P2114 [NOI2014]起床困难综合症
- OpenCV(基础补充)图像二值化