动静态库原理

静态库.a

lib文件夹,存放着所有的库。

我们想写了自己的部分功能实现和代码,很多个.0和.h  但是实现文件太多了,我们把它打包在一起就是静态库。

那么如何打包呢?ar命令

ar -rc libhello.a mython.o myprintf.0
r 代表打包 c创建  前面必须有lib后缀有.a

这样就会形成libhello.a的静态库

打包我们可以在makefile里面来写

那么做好只会该怎么发布呢?一般会有一个include文件夹,这个文件夹里面放着所有的头文件,还有lib文件夹,这个文件夹里面放着所有的库文件。

 然后把这个文件夹给对方。那么对方怎么用呢?

gcc 头文件的默认搜素目录是/usr/include

库文件搜索目录/lib64或usr/lib64

自己写的库属于第三方库,编译的时候要

gcc main.c -lhello
-l 代表链接库 去掉前缀和.a写的时候 
把头文件和库文件,拷贝到库里面这样子叫库的安装。
如果指定目录,不在对应的库目录里面需要使用I 指定头文件目录和库文件目录
gcc main -I./hello/include/ -L./hello/lib/ -hello

静态库是把代码拷贝到文件里面,一旦生成文件之后,更新之后需要重新编译

动态库.so

动态库生成的时候需要加fPIC

gcc -fPIC -c myfile.c myfile.o
fPIC :形成与位置无关的二进制目标文件

静态库是加载是时候需要拷贝到文件之中,必须在特定位置中拷贝好才能使用。而动态库则不用。readelf -S可以查看生成文件使用了那些库。

打包动态库

gcc -shared myprint.o myhello.o libhello.so
这样子可以形成动态库.so文件    

同时生成静态库和动态库

 使用-l 链接默认的是动态库还是静态库呢?当动静态库的时候默认使用动态库。如果只有静态的时候没办法只能使用静态库。那么如果强制使用静态库呢?需要加 -static。动态库在加载的时候只要建立映射关系就可以了。

但是动态库编译的时候这样子就可以了吗?不可以,gcc编译的时候明白,但是,指向的时候操作系统不知道。那么在运行动态库的时候需要

1、拷贝.so文件到系统共享库路径下, 一般指/usr/lib

2、更改LD_LIBRARY_PATH

 

[root@localhost linux]# export LD_LIBRARY_PATH=¥xxxxz自己的库目录[root@localhost linux]# gcc main.c -lmymath[root@localhost linux]# ./a.outadd(10, 20)=30sub(100, 20)=80

或者修改配置文件

 一般是在 置/etc/ld.so.conf.d/ 在这个新建xxxx.conf。然后把自己想要添加的动态库目录,然后粘贴到这个配置文件里面,然后ldconfig.

为什么要写库:

大大减少软件开发周期,提高软件的健壮性,提高软件本身的质量,代码安全。有一定的加密成分。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/465646.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

H12-821_74

74.在某路由器上查看LSP,看到如下结果: A.发送目标地址为3.3.3.3的数据包时,打上标签1026,然后发送。 B.发送目标地址为4.4.4.4的数据包时,不打标签直接发送。 C.当路由器收到标签为1024的数据包,将把标签…

新版UI界面影视小程序亲测无问题带详细搭建教程

新版UI界面影视小程序亲测无问题带详细搭建教程 环境php7.0 — fileinfo–redis–sg11 mysql5.5 apache2.4 添加站点php7.0—-创建ftp—-上传后端文件《后端文件修改,/maccms/wxapi/config/dbs.php–修改当前数据库》—-设置ssl—-打开数据库安装cms 安装好后管…

C++: const 的 权限放大缩小!

目录 概念 引用与const 关于上述的第一段代码: 关于上诉的第二段代码: const 使用指针进行权限的放大和缩小: 注意事项: const 与 成员函数 const 修饰 成员函数的规则: 概念 关于权限的放大和缩小问题&am…

c++求三个数中最大数

#include<iostream> using namespace std; int main() { int a,b,c; cout<<"请输入三个数字"<<endl;//end后面为小写的L cin>>a>>b>>c; if(a>b&&a>c) cout<<"最大数为a:"<<a<<e…

谷粒商城【成神路】-【6】——商品维护

目录 &#x1f9c2;1.发布商品 &#x1f953;2.获取分类关联品牌 &#x1f32d;3.获取分类下所有分组和关联属性 &#x1f37f;4.商品保存功能 &#x1f9c8;5.sup检索 &#x1f95e;6.sku检索 1.发布商品 获取用户系统等级~&#xff0c;前面生成了后端代码&#xff…

C#封装类并因此设计一个简易计算器

目录 一、涉及到的知识点 1.封装 2. 封装性的使用范围 二、实例 1.源码 2.生成效果 一、涉及到的知识点 1.封装 面向对象编程中&#xff0c;大多数都是以类作为数据封装的基本单位。类将数据和操作数据的方法结合成一个单位。设计类时&#xff0c;不希望直接存取类中的数…

windows配置开机自启动软件或脚本

文章目录 windows配置开机自启动软件或脚本配置自启动目录开机运行的脚本调试开机自启动脚本配置守护进程(包装成自启动服务)使用任务计划程序FAQ 开机自动运行脚本示例 windows配置开机自启动软件或脚本 配置自启动目录 在Windows中添加开机自动运行的软件&#xff0c;可以按…

游泳可以戴的耳机有哪些,游泳耳机哪个牌子好性价比高

在游泳训练中&#xff0c;尤其是在进行长距离游泳、控制节奏和进行长时间游泳燃脂时&#xff0c;很容易感到单调乏味。为了帮助自己完成每一个来回&#xff0c;许多游泳运动员除了依赖能量棒和功能饮料外&#xff0c;还会选择通过音乐提高注意力和兴奋度。研究表明&#xff0c;…

Linux操作系统基础(十一):RPM软件包管理器

文章目录 RPM软件包管理器 一、rpm包的卸载 二、rpm包的安装 RPM软件包管理器 rpm&#xff08;英文全拼&#xff1a;redhat package manager&#xff09; 原本是 Red Hat Linux 发行版专门用来管理 Linux 各项软件包的程序&#xff0c;由于它遵循GPL规则且功能强大方便&…

Netty Review - NioEventLoopGroup源码解析

文章目录 概述类继承关系源码分析小结 概述 EventLoopGroup bossGroup new NioEventLoopGroup(1); EventLoopGroup workerGroup new NioEventLoopGroup();这段代码是在使用Netty框架时常见的用法&#xff0c;用于创建两个不同的EventLoopGroup实例&#xff0c;一个用于处理连…

LeetCode.145. 二叉树的后序遍历

题目 145. 二叉树的后序遍历 分析 上篇文章我们讲了前序遍历&#xff0c;这道题目是后序遍历。 首先要知道二叉树的后序遍历是什么&#xff1f;【左 右 根】 然后利用递归的思想&#xff0c;就可以得到这道题的答案&#xff0c;任何的递归都可以采用 栈 的结构来实现&#…

华为问界M9:全方位自动驾驶技术解决方案

华为问界M9的自动驾驶技术采用了多种方法来提高驾驶的便利性和安全性。以下是一些关键技术&#xff1a; 智能感知系统&#xff1a;问界M9配备了先进的传感器&#xff0c;包括高清摄像头、毫米波雷达、超声波雷达等&#xff0c;这些传感器可以实时监测车辆周围的环境&#xff0…