一、废话

之前由于工作需要,要封装一个Linux加密解密转换的动态库,这个之前只做过Windows下面的,Linux下面还真没有做过,之后做了整一个晚上才算做好,不过其中也学到了不少东西,包括Linux下的动态库和静态库,MakeFile等等。之前就已经写了一个练习,之后怕又忘了,总结一下备忘,以后也好查。

很大部分内容都是收集的一些东西还有自己学习的体会,有什么错误或者问题请直接提出。

二、关于库的问题

1.库的原则

现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始。尽量不重复做别人已经做过的事,就是尽量充分利用别人的劳动成果。就是“站在巨人的肩膀上”做事情。

2.库的种类

根据链接时期的不同,库又有:静态库和共享库(动态库)

二者的不同点在于代码被载入的时刻不同

静态库的代码在编译过程中已经被载入可执行程序,因此体积较大

共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。

3.静态库和动态库的比较

接静态库其实从某种意义上来说只不过它操作的对象是目标代码而不是源码而已。因为静态库被链接后库就直接嵌入可执行文件中了,这样就带来了两个问题。

(1)首先就是系统空间被浪费了。这是显而易见的,想象一下,如果多个程序链接了同一个库,则每一个生成的可执行文件就都会有一个库的副本,必然会浪费系统空间。

(2)再者,一旦发现了库中有bug,挽救起来就比较麻烦了。必须一一把链接该库的程序找出来,然后重新编译。

而动态库的出现正弥补了静态库的以上弊端。因为动态库是在程序运行时被链接的,所以磁盘上只须保留一份副本,因此节约了磁盘空间。如果发现了bug或要升级也很简单,只要用新的库把原来的替换掉就行了。

但是静态库也有自己的优点:

编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。

静态库的名字一般是libxxx.a(Linux)

动态库的名字一般是libxxx.so (Linux),有时候也是 libxxx.so.major.minor,xxxx是该lib的名称,major是主版本号, minor是副版本号

linux系统有几个重要的目录存放相应的函数库,如/lib /usr/lib

4.如何判断一个程序有没有链接动态库

(1)file命令

file程序是用来判断文件类型的,啥文件一看都清楚明了。

(2)ldd命令

看动态库,如果目标程序没有链接动态库,则打印“not a dynamic executable” (不是动态可执行文件)

<file :run和run_dyn都是可运行文件,action.h上一个ASCII C++文件>

<ldd: run_dyn 使用了共享库,action.o是不动态可执行文件>

5.linux下库文件是如何产生的

(1)静态库

静态库的后缀是.a,它的产生分两步

Step 1.由源文件编译生成一堆.o,每个.o里都包含这个编译单元的符号表

Step 2.ar命令将很多.o转换成.a,成文静态库

(2)动态库

动态库的后缀是.so,它由gcc加特定参数编译产生。

三、我的学习例子

1.要用到的工具

g++/gcc

ar

gcc常用参数

-L 加载库文件路径

-l 指明库文件名字

-fPIC 达到动态链接的目的,还有一个什么要注意的,忘了

-I dir选项的功能,在头文件的搜索路径列表中添加 dir 目录

2.我的文件

(1)doThing

//dosomething.h

  1: #ifndef DOSOMETHING_H 
  2: #define DOSOMETHING_H 
  3:  
  4: #include <string> 
  5:  
  6: void doThing(const std::string& strThing); 
  7:  
  8: #endif // DOSOMETHING_H 
  9: 

//dosomething.cpp

  1: #include "dosomething.h" 
  2: #include<iostream> 
  3:  
  4: void doThing(const std::string& strThing) 
  5: { 
  6:   std::cout << "start do thing :" << strThing << std::endl; 
  7: } 
  8: 

(2)Action类,使用doThing函数

//action.h

  1: #ifndef ACTION_H 
  2: #define ACTION_H 
  3: #include<string> 
  4:  
  5: using namespace std; 
  6:  
  7: class Action 
  8: { 
  9:   public: 
 10:     void setAction(const string& strAction); 
 11:     void doAction(void); 
 12:      
 13:   private: 
 14:     string mstrAction; 
 15: }; 
 16:  
 17: #endif // ACTION_H 
 18: 

//action.cpp

  1: #include "action.h" 
  2: #include "dosomething.h" 
  3:  
  4: void Action::setAction(const string& strAction) 
  5: { 
  6:   mstrAction = strAction; 
  7: } 
  8:  
  9: void Action::doAction(void ) 
 10: { 
 11:   doThing(mstrAction); 
 12: } 
 13: 

(3)主文件

//main.cpp

  1: #include <iostream> 
  2: #include "action.h" 
  3:  
  4: int main(int argc, char **argv) 
  5: { 
  6:      
  7:   Action action; 
  8:   action.setAction("say hello!"); 
  9:   action.doAction(); 
 10:    
 11:   return 0; 
 12: } 
 13: 

linux下生成写库文件代码好像更容易些,不用写Windows下面那样的在头文件还要要写DLL导出,显得很干净。

3.使用静态库的方法

基本命令:

g++ –c –o –L –l -I

ar cr 打包

最后生成了run,可以直接执行成功。

4.使用动态库

基本命令:

g++ –c –o –shared –fPIC –L –l –I

生成so时加 –shared –fPIC

我在生成后立即执行有错误了。

原因:因为在动态函数库使用时,会查找/usr/lib、/lib目录下的动态函数库,而此时我们生成的库不在里边。

这个时候有好几种方法可以让他成功运行:

(1)最直接最简单的方法就是把so拉到/usr/lib或/lib中去,但这好像有点污染环境吧?

(2)export LD_LIBRARY_PATH=$(pwd)

(3)可以在/etc/ld.so.conf文件里加入我们生成的库的目录,然后/sbin/ldconfig

关于/etc/ld.so.conf

/etc/ld.so.conf里面存放的是链接器和加载器搜索共享库时要检查的目录,默认是从/usr/lib /lib中读取的,所以想要顺利运行,我们也可以把我们库的目录加入到这个文件中并执行/sbin/ldconfig 。

关于/etc/ld.so.cache

/etc/ld.so.cache里面保存了常用的动态函数库,且会先把他们加载到内存中,因为内存的访问速度远远大于硬盘的访问速度,这样可以提高软件加载动态函数库的速度了。

使用了第(2)种方法解决问题

四、其它涉及到的东西

(1)dlopen方法的动态库显式调用

(2)gcc的各个参数

(3)makefile的编写

五、感谢

学习过程中参考了好多其它文章,由于之前存的TXT参考,无法查找出处给出链接,在这里谢谢作者,这里仅供本人学习。

您可以对本文随意转载修改或使用,但请保持正确性,不要误导他人。

本文出处:http://pppboy.blog.163.com/blog/static/302037962011112104720934/

Linux静态库和动态库学习总结相关推荐

  1. Linux学习:静态库和动态库

    1.库是什么? 将"源代码"变为"二进制格式的源代码"(作用:加密,别人可以用,但不知道其中的内容). 2.库制作出来之后,如何给用户使用? 需要给用户:头文件 ...

  2. 【Linux系统编程学习】 静态库与动态库的对比与总结

    此为牛客网Linux C++课程 1.9 的课程笔记. 1. 前几节课知识总结 程序编译成为可执行文件的过程: 静态库制作过程: 动态库制作过程: 2. 静态库的优缺点: 3. 动态库的优缺点: 更多 ...

  3. [学习备忘录]Linux平台静态库、动态库的一些笔记

    先声明几点: 1.操作系统:linux(fc9).编译器:gcc-4.3.0.编辑器:包括但不限于emacs.vim.这些无理由也不应造成限制. 2.生成的可执行文件名称比较有规律,仅仅是为了演示的方 ...

  4. linux下静态库和动态库学习

    今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻.在这之前,我们需要了解一下源代码到可执行程序之间到底发生了什么神奇而美妙的事情. 在Linux操作系统中,普遍使用E ...

  5. Linux 之三 静态库及动态库的编写和使用

      最近在整理旧电脑时,发现了一些刚入行时的学习记录,以及最早使用新浪博客 http://blog.sina.com.cn/zcshou 写的一些文章.最近要重拾 Linux,所以把这些 Word 文 ...

  6. linux系统下的“静态库和动态库”专题之二:库的创建和使用

    接上文[linux系统下的"静态库和动态库"专题之一:库的概念和规则]所述,我们通常把一些公用函数制作成函数库,供其它程序使用.函数库分为静态库和动态库两种. – 静态库在程序编译 ...

  7. linux分文件编程、静态库与动态库

    参考:linux静态库与动态库编程 作者:丶PURSUING 发布时间:2021-02-02 16:51:49 网址:https://blog.csdn.net/weixin_44742824/art ...

  8. dlopen linux 实例_Linux静态库和动态库

    库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 静态库和动态库的区别 1. 静态函数库 这类库的名字一般是libxxx.a:利用静态函数库编译成的文件比较大 ...

  9. Linux静态库和动态库的设计

    静态库和动态库的设计 宗旨:技术的学习是有限的,分享的精神是无限的. Linux应用程序设计中需要的外部函数主要由函数库和系统调用来提供 Linux应用程序使用的主要函数库均存放于/lib, /usr ...

最新文章

  1. 十年后你用什么听音乐?
  2. iOS开发CocoaPods使用
  3. hibernate官方新手教程 (转载)
  4. 函数return,有些地方你可能还没掌握
  5. Flutter 弧度与角度之间的换算
  6. vscode终端无法识别node
  7. Java实现密码学工具,集成了对称加密算法DES,AES,IDEA,公开加密算法RSA,ECC,散列算法MD5,SHA1,CRC32,以及RSA,DSA,ECDSA数字签名验证示例。
  8. Python实战技术 - Python虚拟隔离环境 和 Docker技术
  9. x86基础之数与数据类型
  10. 如何用Camtasia制作简单动画?
  11. java求抽象类shape_java 抽象类 Shape
  12. 正则表达式:提取数字和小数点
  13. 电脑里的所有播放器只能播放声音没有画面
  14. linux中tmp文件在哪,学习LINUX入门,/tmp文件夹
  15. Unity3D 局部截图、全屏截图、带UI截图三种方法
  16. TokenInsight 对话首席——加密通证期货世界,究竟是投机还是金融工具?
  17. 狗屁不通文章生成器登顶GitHub热榜,分分钟写出万字形式主义大作
  18. 百度网盘直链下载教程
  19. python实现简陋的贪吃蛇小游戏
  20. 等一等!看一看!缓一缓!

热门文章

  1. django debug=false后静态文件丢失_python框架Django实战商城项目之工程搭建
  2. vue 移动到图片浮动_基于Vue实现图片在指定区域内移动
  3. python3 线程隔离_Python的线程隔离实现方法
  4. [渝粤教育] 郑州航空工业管理学院 电工电子技术基础 参考 资料
  5. 【渝粤教育】国家开放大学2018年春季 0222-22T模拟电子电路 参考试题
  6. 【渝粤教育】电大中专药事管理与法规作业 题库
  7. 【渝粤教育】广东开放大学 数据结构 形成性考核 (24)
  8. 【渝粤题库】国家开放大学2021春2517社区工作题目
  9. 【渝粤题库】国家开放大学2021春2180办公室管理题目
  10. sts 创建webservice项目_Eclipse Maven生成WebService客户端代码及测试