加入收藏 | 设为首页 | 会员中心 | 我要投稿 晋中站长网 (https://www.0354zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux下C/C++动静态库

发布时间:2023-01-09 14:32:58 所属栏目:Linux 来源:网络
导读:
定义 myadd.c mysub.c


我们想把此方法提供给别人使用,但我们并不想提供源码。
此时就需要使用库来解决
什么是库?
库就是方法们编译为二进制码后整合在一起。供程序链接。
动态库 libx

拖库 163_拖库撞库是什么意思_linux 拖库

定义 myadd.c mysub.c

拖库 163_拖库撞库是什么意思_linux 拖库

linux 拖库_拖库 163_拖库撞库是什么意思

我们想把此方法提供给别人使用,但我们并不想提供源码。

此时就需要使用库来解决

什么是库?

库就是方法们编译为二进制码后整合在一起。供程序链接。

动态库 libxxx.so

运行时把库代码加载到内存,通过页表映射到虚拟地址空间的共享区,当程序需要方法时,再跳转去执行库中的代码,程序本身没有方法的代码。因此程序运行依赖库文件,无法独立运行

静态库 libxxx.a

编译时把库中代码拷贝链接到程序里,运行时执行自己的代码,可以独立运行,不依赖库文件。

如何生成 静态库 1.将方法编译为.o文件(二进制码)

此时已经可以交给他人使用 但是并不规范

拖库撞库是什么意思_拖库 163_linux 拖库

2.利用归档工具ar 整合.o文件为静态库

拖库撞库是什么意思_拖库 163_linux 拖库

动态库 1.编译出与位置无关码(编译时添加 -fPIC选项 )

动态库需要与位置无关码是因为 程序需要在运行时再去找库的代码linux 拖库,库和进程地址空间独立

linux 拖库_拖库撞库是什么意思_拖库 163

2.利用gcc/g++ 将.o文件再次编译为动态库

在编译时添加 -shared 选项 表示编译为动态库,需要确保.o文件为 fPIC形式

拖库撞库是什么意思_linux 拖库_拖库 163

如何使用

例有如下代码 mytest.c

linux 拖库_拖库撞库是什么意思_拖库 163

如何只利用我们上面生成的动静态库让这段代码跑起来呢

静态库 libmymath.a

拖库 163_linux 拖库_拖库撞库是什么意思

1.-L 指定库路径

编译器会默认到系统库目录去找 所以需要 -L 指定库路径 或把库拷贝到系统库路径或者建立软硬链接(造成命名污染,不推荐)

2. -l 指定库名

库名需要去掉前缀(lib)和后缀(.a/.so)这一步比较特殊

运行结果无误

拖库撞库是什么意思_linux 拖库_拖库 163

动态库 libmymath.so

linux 拖库_拖库撞库是什么意思_拖库 163

1.-L 指定库目录 -l 指定库名

此时运行, 可能出错

拖库 163_linux 拖库_拖库撞库是什么意思

程序运行时找不到动态库

因为程序一旦编译出来 就与编译器无关了 ,经过了编译操作系统只知道这个进程依赖那些库,程序运行起来后 却可能不知道操作系统不知道去哪里 把库加到内存,因此我们需要执行第二步

2.添加环境变量(推荐)

你也可以直接把库拷贝到系统库路径(或建立软硬链接)或添加配置文件->都可能造成命名污染 (不推荐)

我们env 中有一个环境变量LD_LIBRARY_PATH 来保存默认的库的路径

拖库撞库是什么意思_拖库 163_linux 拖库

我们往这个环境变量中添加库所在的路径 ,动态库就能被正确的加载到内存了

拖库 163_linux 拖库_拖库撞库是什么意思

此时程序能正确运行

(编辑:晋中站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!