c++ 静态库,动态库的制作和使用

news2024/11/23 21:11:58

文章目录

    • 1.什么是库?
    • 2.静态库的制作
      • 1.静态库的命名规则
      • 2.静态库的制作与使用
        • 1.静态库的制作
        • 2.静态库的使用
    • 3.动态库的制作
      • 1.动态库的命名规则
      • 2.动态库的制作与使用
        • 1.动态库的制作
        • 2.动态库的使用
        • 3.动态库加载失败的原因
    • 4.静态库和动态库的对比
        • 1.程序编译成可执行文件的过程:
        • 2.静态库的制作过程
        • 3.动态库的制作过程
        • 5.静态库的优缺点
        • 6.动态库的优缺点


1.什么是库?

  • 库文件是计算机上的一类文件,提供给使用者一些可以直接拿来使用的变量、函数或者类。
  • 库是特殊的一种程序,编写库的程序和编写一般的程序区别不是很大,只是库不能单独运行。
  • 库文件有两种:静态库和动态库(共享库),区别是:静态库在程序的链接阶段被复制到了程序中,动态库在链接阶段没有被复制到程序中,而是在程序运行时由系统动态的加载到内存中提供给程序调用。
  • 库文件的好处:1.代码保密 2.方便部署和开发

2.静态库的制作

1.静态库的命名规则

  • linu下:libxxx.a
    lib:.库文件的前缀(固定的)
    xxx:库的名字,可以自己起
    .a:后缀,固定
  • windows下:libxxx.lib

2.静态库的制作与使用

1.静态库的制作

  1. gcc获得.o文件
  2. 将.o文件打包,使用ar工具(archive)
    ar rcs libxxx.a xxx.o xxx.o
    r:将文件插入到备存文件中
    c:建立备存文件
    s:索引

示例:将如下shape-test.cpp 文件编译成静态库
head.h

#pragma once
#include <iostream>
#include <string>


extern int add(int x, int y);

extern int mutil(int x, int y);

extern int subtract(int x, int y);

extern int div(int x, int y);

add.cpp

#include "head.h"

int add(int x, int y)
{
	return x + y;
}

subtract.cpp

#include "head.h"

int subtract(int x, int y)
{
	return x * y;
}

mutil.cpp

#include "head.h"

int subtract(int x, int y)
{
	return x * y;
}

div.cpp

#include "head.h"

int div(int x, int y)
{
	return x / y;
}

main.cpp

#include <stdio.h>
#include "head.h"

int main()
{
	int a = 20;
	int b = 12;

	printf("a = %,b = %d\n", a, b);
	printf("a + %,b = %d\n", add(a,b));
	printf("a - %,b = %d\n", mutil(a, b));
	printf("a * %,b = %d\n", subtract(a, b));
	printf("a / %,b = %d\n", div(a, b));
}

1.gcc获得.o文件

gcc -c add.cpp div.cpp main.cpp  mutil.cpp

在这里插入图片描述
在这里插入图片描述

2.使用ar rcs 命令创建静态库

ar rcs libcalc.a  add.o  mutil.o div.o subtract.o

在这里插入图片描述

2.静态库的使用

1.编译主程序文件

gcc main.cpp -lstdc++  -o app -I ./include/ -l calc -L./lib

-o:生成目标文件
-I:头文件目录 
-l: 库文件名
-L./lib:到当前目录./lib下找依赖静态库

2.执行主程序文件

./app

在这里插入图片描述

3.动态库的制作

1.动态库的命名规则

  • linu下:libxxx.so
    lib:.库文件的前缀(固定的)
    xxx:库的名字,可以自己起
    .so:后缀,固定
    在linux下是一个可执行文件
  • windows下:libxxx.dll

2.动态库的制作与使用

1.动态库的制作

  1. gcc获得.o文件,得到和位置无关的代码
    gcc -c -fpic/-fPIC a.c b.c
  2. gcc 得到动态库
    gcc -shared a.o b.o -o libxxx.so

1.gcc获得.o文件

gcc -lstdc++ -c  -fpic add.cpp div.cpp mutil.cpp subtract.cpp

在这里插入图片描述
2.gcc 得到动态库

gcc -shared add.o mutil.o div.o subtract.o -o libcalc.so

在这里插入图片描述

2.动态库的使用

1.编译主程序文件

gcc -lstdc++  main.cpp  -o main -I ./include/ -L lib -l calc

在这里插入图片描述

2.执行主程序文件
在这里插入图片描述

3.动态库加载失败的原因

静态库和动态库工作原理:

  • 静态库:GCC进行链接时,会把静态库中代码打包到可执行文件中
  • 动态库:GCC进行链接时,动态库的代码不会被打包到可执行程序中
  • 程序启动后,动态库会被动态加载到内存中,通过ldd(list dynamic dependencies)命令检查动态库依赖关系
  • 渡河定位共享库文件内?
    当系统加载可执行代码的时候,能够指导所依赖的库的名字,但是还是需要知道库的绝对路径。此时就需要系统的动态载入器来获取该绝对路径。对于elf格式的可执行程序,是由ld-linux.so来完成,它先后搜索elf文件的DT_RPATH段 --> 环境变量 --> /etc/ld.socache文件列表 --> /lib/,/usr/lib 目录找到库文件后将其存入到内存中

使用ldd命令可以列出程序连接的动态库的信息

在这里插入图片描述
动态库加载失败的解决办法:在环境变量中配置动态库的路径
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

4.静态库和动态库的对比

1.程序编译成可执行文件的过程:

在这里插入图片描述

2.静态库的制作过程

在这里插入图片描述

3.动态库的制作过程

在这里插入图片描述

5.静态库的优缺点

  • 优点
    • 静态库被打打包到应用程序中加载速度快
    • 发布程序无需提供静态库,移植方便
  • 缺点
    • 消耗资源,浪费内存
    • 更新部署麻烦

在这里插入图片描述

6.动态库的优缺点

  • 优点

    • 可以实现进程间资源共享(共享库)
    • 更新、部署、发布简单
    • 可以控制何时加载动态库
  • 缺点

    • 加载速度相对于静态库加载慢
    • 发布程序是需要体用依赖动态库

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]Python计算机毕业设计Django基于Java的失物招领平台

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

时序数据库选型

目录一、当前主流的时序数据库二、各库特性1、Influxdb2、Timescale3、Druid4、Kdb5、Graphite6、RRDtool7、OpenTSDB8、TDengine9、DolphinDB三、优缺点对比因为个人用的go&#xff0c;所以调研及对比主要针对适配了go语言的数据库。 一、当前主流的时序数据库 排名参考于h…

基于PHP+MySQL动漫专题网站系统的设计与实现

随着时代的发展&#xff0c;人们兴趣爱好也越来越广泛&#xff0c;动漫是当前年轻人比较钟爱的一个兴趣爱好之一&#xff0c;每年都会有大量的动漫爱好者定期的举办一些交流活动等&#xff0c;但是线下的这种交流方式明显不能满足当前动漫爱好者的需求&#xff0c;为此我开发了…

Zen of Python(python之禅)

在python中导入import this就会显式&#xff1a; 以下是中文英文翻译&#xff1a; Beautiful is better than ugly. 优美比丑陋好 Explicit is better than implicit. 清晰比晦涩好 Simple is better than complex. 简单比复杂好 Complex is better than complicated. 复杂比错…

【全干工程师必学】一文搞懂Vue2.0

一文搞懂Vue2.0一、前端工程化二、WebPack是什么基本使用实现奇偶行变色1.初始化包管理工具2.安装jquery3.在项目中安装webpack4.在项目中配置webpack5.运行代码mode 的可选值developmentproductionwebpack.config.js 文件的作用webpack 中的默认约定自定义打包的入口与出口web…

uni-app开发常用操作速查记录

记录一下uni-app中常用的使用方法或是操作步骤,方便后期速查使用. 1.设置对象属性 2.组件中数据变化监听方法 3.微信开发者工具中全局搜索与局部搜索 4.Page对象与Componet对象组成 5.tabbar页面切换方法 6.组件中自定义函数的参数传递 7.m…

Android Jetpack Compose的基本介绍

目录一、引言&#xff1a;Android Jetpack1.Jetpack是什么&#xff1f;2. 常用的Jetpack库二、Compose的基本概念1.什么是Jetpack Compose2.Compose的编程思想三、 Compose简单的案例: 一个倒计时效果1.构建一个Compose项目2.声明一个倒计时的UI3.利用线程使其动起来4.实现效果…

快速了解Docker

目录 1.简介 2.Docker的安装及环境配置 2.1.查看是否是root用户 2.2.查看当前内核版本 2.3.更新yum源 2.4.安装Docker所需要的工具包 2.5.设置yum源 2.6.下载安装Docker 2.7.启动Docker并且设置开机自启动 2.8.测试是否安装成功 3.Docker阿里云镜像仓库配置 4.Docker常…

C++ vector

目录 1.vector的介绍及使用 1.1 vector的介绍 1.2 vector的使用 1.2.1 vector的定义 1.2.2 vector iterator 的使用 1.2.3 vector 空间增长问题 1.2.3 vector 增删查改 1.2.4 vector 迭代器失效问题。&#xff08;重点&#xff09; 1.2.5 vector 在OJ中的使用 2.vec…

【Linux】Linux的常见指令详解(上)

目录 前言 ls pwd cd mkdir touch rm man tree nano cp mv cat echo more/less 前言 &#x1f9c1;Linux作为相较于windows的另一种操作系统&#xff0c;同时基于其开源的优越性&#xff0c;使得其在各各企业的使用率极高。因此学好Linux操作系统对我们来说是…

Mongoose应用和文件文件的上传和下载

一、Express框架访问MongoDB数据库 1、目的&#xff1a; ​ &#xff08;1&#xff09;mongoose模块的使用 ​ &#xff08;2&#xff09;学会代码的封装&#xff1a;dao层、service层、接口层 ​ &#xff08;3&#xff09;MVC设计思想&#xff1a;M(Model)、V(View)、C(C…

[附源码]Python计算机毕业设计Django基于SpringBoot的演唱会购票系统论文2022

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;我…

c#与mysql连接和操作教程(增、删、改、查)

一、mysql的连接&#xff08;使用的是vs2019&#xff09; 1. 在一个项目中选择 工具 > NgtGet包管理器 > 管理解决方案的NuGet程序包 2. 搜索MySql.Data&#xff0c;然后下载&#xff0c;并在右边选着对应的项目进行安装&#xff08;ps&#xff1a;每个项目要连接数据库…

【身份证识别】基于BP神经网络实现身份证识别附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

代码随想录刷题|LeetCode 300.最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组

目录 300.最长递增子序列 思路 1、dp[i]的定义 2、递推公式 3、dp数组初始化 4、确定遍历顺序 5、推导dp数组 最长递增子序列 674. 最长连续递增序列 思路 最长连续递增序列 动态规划 贪心算法 718. 最长重复子数组 思路 1、确定dp数组的含义 2、确定递推公式 3、dp数组初始化…

docker 命令

目录 Docker 环境信息命令 docker info docker version 系统日志信息常用命令 docker events docker logs docker history 容器的生命周期管理命令 docker create docker run 常用选项 系统 网络 健康检查 命名空间选项 cgroup资源限制选项 CPU CPUset devi…

李宏毅《DLHLP》学习笔记7 - Voice Conversion 1

视频链接&#xff1a;https://www.youtube.com/watch?vJj6blc8UijY&listPLJV_el3uVTsO07RpBYFsXg-bN5Lu0nhdG&index9&ab_channelHung-yiLee 课件链接&#xff1a;https://speech.ee.ntu.edu.tw/~tlkagk/courses/DLHLP20/Voice%20Conversion%20(v3).pdf 1. 语音转…

永磁同步电机恒压频比(V/F)开环控制系统Matlab/Simulink仿真分析及代码生成到工程实现(二)

文章目录前言一、SVPWM二、永磁同步电机恒压频比开环控制系统Matlab/Simulink仿真分析2.1.仿真电路分析2.1.1.恒压频比控制算法2.1.2.输出处理2.1.3.主电路2.2.仿真结果分析三、永磁同步电机恒压频比开环控制系统代码生成及工程实现3.1.恒压频比开环控制算法代码生成3.2.仿真验…

计算机毕业论文Java项目源码下载基于SSM的旅游资讯网站含前台与后台

&#x1f496;&#x1f496;更多项目资源&#xff0c;最下方联系我们✨✨✨✨✨✨ 目录 Java项目介绍 资料获取 Java项目介绍 《ssm地方旅游资讯网站》该项目采用技术&#xff1a;jsp 、springmvc、spring、mybatis 、css、js、jQuery、bootstrap、easyui等相关技术&#x…

在云服务器上部署jupyter服务器环境(with conda-forge)

tags: Python Conda Tips Server 写在前面 最近想折腾点服务器的新花样(总是空着太可惜了), 想到前阶段配置的jupyter, 发现这不就能部署在服务端吗?还不走流量的那种(指安装包时候), 话不多说, 开整! 下面的用户名以及组都是test, 用于测试. 大家需要改成自己的用户名. 安装…