C++静态和动态链接库导出和使用

news2024/11/18 3:21:32

1、简介

代码开发过程中会遇到很多已有的函数库,这些函数库是现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。

本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态链接库和动态链接库。

动态链接库包含了函数所在的DLL文件和函数入口等相关信息,代码由运行时加载在进程空间中的DLL提供,显示调用不需要仅需要动态链接库的dll文件,无需头文件.h和动态链接库.lib文件,隐式调用则需要上述三种文件。
动态库特点:

  • 动态库把对一些库函数的链接载入推迟到程序运行时期。
  • 可以实现进程之间的资源共享。(因此动态库也称为共享库)
  • 将一些程序升级变得简单。
  • 甚至可以真正做到链接载入完全由程序员在程序代码中控制(显示调用)

静态链接库包含了函数实现本身,在编译的时候直接将代码放入程序中。在调用静态链接库的时,需要使用静态链接库的头文件.h以及静态链接库的.lib文件。

静态库特点:

  • 静态库对函数库的链接是放在编译时期完成的
  • 程序在运行时与函数库再无瓜葛,移植方便。
  • 浪费空间和资源,因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件
  • 如果静态库进行更新则应用该库的所有程序都需要重新编译(全量更新)。

2、Windows动态链接库使用

2.1 动态链接库生成

首先新建工程MathLibrary_dll,在源文件中添加MathLibrary.cpp,在头文件中添加MathLibrary.h,具体代码如下:

  • 添加头文件MathLibrary.h如下:
#pragma once

#ifndef MATHLIBRARY
#define MATHLIBRARY

#ifdef MATHLIBRARY_EXPORTS
#define MATHLIBRARY_API __declspec(dellexport)
#else
#define MATHLIBRARY_API __declspec(dllimport)
#endif // MATHLIBRARY_EXPORTS


namespace MathLibrary {

	class MATHLIBRARY_API Arithmetic
	{
	public:
		Arithmetic();
		~Arithmetic();
		// Returns a + b
		double Add(double a, double b);

		// Returns a - b
		double Subtract(double a, double b);

		// Returns a * b
		double Multiply(double a, double b);

		// Returns a / b
		double Divide(double a, double b);

	private:

	};
	extern "C" MATHLIBRARY_API double power(double a, double ratio);
}
#endif // !MATHLIBRARY
  • 添加源文件MathLibrary.cpp
// MathLibrary.cpp
// compile with: cl /c /EHsc MathLibrary.cpp
// post-build command: lib MathLibrary.obj

#include "MathLibrary.h"
#include<math.h>

namespace MathLibrary
{
    Arithmetic::~Arithmetic() {};
    Arithmetic::Arithmetic() {};

    double Arithmetic::Add(double a, double b)
    {
        return a + b;
    }

    double Arithmetic::Subtract(double a, double b)
    {
        return a - b;
    }

    double Arithmetic::Multiply(double a, double b)
    {
        return a * b;
    }

    double Arithmetic::Divide(double a, double b)
    {
        return a / b;
    }
    double power(double a, double ratio) {
        return pow(a, ratio);
    }
}
  • 生成动态链接库
    在项目的配置属性页选择配置类型为动态库(.dll)
    在这里插入图片描述
    生成的DLL文件如下所示:
    在这里插入图片描述

2.2 动态链接库使用

  • 新建测试动态链接库的项目MathLibrary_dll_test,并在源文件中添加一个测试代码如下所示:
#include <iostream>
#include "MathLibrary.h"
using namespace MathLibrary;

int main()
{
    double a = 7.0;
    int b = 99;
    double ratio = 2.0;
    Arithmetic *demo_class = new Arithmetic();
    std::cout <<"Add结果为= " << demo_class->Add(a, b) << std::endl;
    std::cout << "Multiply结果为= " << demo_class->Multiply(a, b) << std::endl;
    std::cout << "Divide结果为= " << demo_class->Divide(a, b) << std::endl;
    std::cout << "Subtract结果为= " << demo_class->Subtract(a, b) << std::endl;
    std::cout << "power结果为= " << power(a,ratio) << std::endl;
    delete demo_class;
    return 0;
}
  • 环境配置包括三步

1、属性页->C\C+±>附加包含目录,添加头文件目录
在这里插入图片描述
2、属性页->链接器->附加库目录中,添加lib文件目录
在这里插入图片描述
3、属性页->链接器->输入->附加依赖项,添加MathLibrary_dll.lib
在这里插入图片描述

  • 运行测试程序,结果正常显示如下:
    在这里插入图片描述

3、Windows静态链接库使用

3.1 静态链接库生成

首先新建工程MathLibrary,在源文件中添加MathLibrary.cpp,在头文件中添加MathLibrary.h,具体代码如下:

  • 添加头文件MathLibrary.h如下:
#pragma once

namespace MathLibrary {

	class Arithmetic
	{
	public:
		Arithmetic();
		~Arithmetic();
		// Returns a + b
		static double Add(double a, double b);

		// Returns a - b
		static double Subtract(double a, double b);

		// Returns a * b
		static double Multiply(double a, double b);

		// Returns a / b
		static double Divide(double a, double b);

	private:

	};
}
  • 添加源文件MathLibrary.cpp
#include "MathLibrary.h"

namespace MathLibrary
{
    Arithmetic::~Arithmetic() {};
    Arithmetic::Arithmetic() {};

    double Arithmetic::Add(double a, double b)
    {
        return a + b;
    }

    double Arithmetic::Subtract(double a, double b)
    {
        return a - b;
    }

    double Arithmetic::Multiply(double a, double b)
    {
        return a * b;
    }

    double Arithmetic::Divide(double a, double b)
    {
        return a / b;
    }
}
  • 设置属性页并生成静态链接库
    在这里插入图片描述
    生成的静态lib文件如下所示:
    在这里插入图片描述

3.2 静态链接库使用

  • 新建测试静态链接库的项目MathLibrary_test,并在源文件中添加一个测试代码test.cpp如下所示:
#include <iostream>
#include "MathLibrary.h"

int main()
{
    double a = 7.4;
    int b = 99;

    std::cout << "a + b = " <<
        MathLibrary::Arithmetic::Add(a, b) << std::endl;
    std::cout << "a - b = " <<
        MathLibrary::Arithmetic::Subtract(a, b) << std::endl;
    std::cout << "a * b = " <<
        MathLibrary::Arithmetic::Multiply(a, b) << std::endl;
    std::cout << "a / b = " <<
        MathLibrary::Arithmetic::Divide(a, b) << std::endl;

    return 0;
}
  • 环境配置
    在属性页->VC++目录->包含目录,添加头文件地址
    在属性页->VC++目录->库目录,添加库文件地址
    在这里插入图片描述
    在属性页->链接器->输入->附加依赖项,添加静态库lib名称MathLibrary.lib
    在这里插入图片描述
  • 运行测试程序,结果正常显示如下:
    在这里插入图片描述
    以上就是windows系统上使用visual studio 2019进行静态库和动态库的生成和使用说明,仅作记录。

参考:
https://blog.csdn.net/htt789/article/details/81454832
https://www.cnblogs.com/skynet/p/3372855.html
https://learn.microsoft.com/zh-cn/cpp/build/walkthrough-creating-and-using-a-dynamic-link-library-cpp?view=msvc-170
——END——

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

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

相关文章

便携式水质自动采样器助力毒情监测

便携式水质自动采样器可助力毒情监测&#xff1a; 污水涉毒采样检测工作是运用科技手段准确评估监测辖区内毒情形势的重要手段。期间&#xff0c;民警详细了解了生活和工业污水的处理、排放以及服务范围、人口数量等情况&#xff0c;并就污水涉毒采样检测工作达成共识。随后&am…

revit中用幕墙来绘制瓦片屋面和生成土钉墙

一、revit中用幕墙来绘制瓦片屋面 层层叠叠的瓦片在我们绘制时具有复杂性&#xff0c;瓦片既美观又满足一些建筑的需要&#xff0c;下面教大家一个用幕墙来绘制瓦片屋面。 新建一个族样板选择公制轮廓—竖挺&#xff0c;绘制我们的瓦片形状 简单的绘制一个瓦片的形状&#xff0…

JVM学习整理(一)

一、JVM的基本介绍 JVM 是 Java Virtual Machine 的缩写&#xff0c;它是一个虚构出来的计算机&#xff0c;一种规范。通过在实际的计算机上仿真模拟各类计算机功能实现 好&#xff0c;其实抛开这么专业的句子不说&#xff0c;就知道JVM其实就类似于一台小电脑运行在windows或…

ruoyi-vue前后端分离项目实现一体化打包(前后端合并打包)

场景 现在要对ruoyi-vue前后端分离项目&#xff0c;进行一体化打包&#xff0c;即 将前后端项目打在一个jar里面 一体化打包优点 不需要再使用nginx&#xff0c;直接将前端文件放到后端项目里面 改造ruoyi-vue项目 后端改造 1、引入依赖spring-boot-starter-thymeleaf &…

倒计时 1 天 | SphereEx 在 2023 亚马逊云科技中国峰会等你来打卡!

2023 年 6 月 27 - 28 日&#xff0c; “因构建而可见” 2023 亚马逊云科技中国峰会将在上海隆重举行&#xff0c;SphereEx 将携面向新一代数据架构的数据库增强引擎&#xff1a;SphereEx-DBPlusEngine 亮相亚马逊云科技中国峰会&#xff0c;展示分布式数据库、数据安全、信创替…

FFmpeg视频转码关键参数详解

1 固定码率因子crf&#xff08;Constant Rate Factor&#xff09; 固定码率因子&#xff08;CRF&#xff09;是 x264 和 x265 编码器的默认质量&#xff08;和码率控制&#xff09;设置。取值范围是 0 到 51&#xff0c;这其中越低的值&#xff0c;结果质量越好&#xff0c;同…

实力见证丨酷雷曼VR再获2项国家发明专利

近日&#xff0c;酷雷曼公司&#xff08;北京同创蓝天云科技有限公司&#xff09;再次喜获两项发明专利证书:“VR多端协同交互方法及相关设备”、“VR展示用户操作方法及相关设备” 。两项专利均基于酷雷曼3D VR系统发明&#xff0c;进一步优化了目前VR全景触控界面互动性及交互…

企业所得税高是怎么回事?该如何解决?

企业所得税高是怎么回事&#xff1f;该如何解决&#xff1f; 《税筹顾问》专注于园区招商、企业税务筹划&#xff0c;合理合规助力企业节税! 企业所得税高&#xff0c;一般企业都会运用一些税务筹划的方式来解决&#xff0c;那么事前的规划和搭建好业务框架就显得尤为重要。真…

FFmpeg初识

一、简介 它的官网为&#xff1a;https://ffmpeg.org/&#xff0c;由Fabrice Bellard&#xff08;法国著名程序员Born in 1972&#xff09;于2000年发起创建的开源项目。该人是个牛人&#xff0c;在很多领域都有很大的贡献。 FFmpeg是多媒体领域的万能工具。只要涉及音视频领域…

第43步 深度学习图像识别:InceptionResnetV2建模(Tensorflow)

基于WIN10的64位系统演示 一、写在前面 &#xff08;1&#xff09;InceptionResnetV2 InceptionResNetV2是一种由Google研究人员开发的深度学习模型&#xff0c;是一种混合了Inception和ResNet&#xff08;残差网络&#xff09;两种结构的卷积神经网络&#xff08;CNN&#…

通过cifar-10数据集理解numpy数组的长(H)、宽(W)、通道(C)

文章目录 1、CIFAR-10数据集介绍1.1 CIFAR-10数据集的构成1.2 batches.meta1.3 data_batch_n.py & test_batch.py 2、获取一张图片的data数据2.1 反序列化获得numpy数据2.2 清楚numpy中的H、W、C的含义2.3 清楚RGB图片在numpy中的表示 3、处理图片数据的代码 1、CIFAR-10数…

渗透测试实战-BurpSuite 使用入门

前言 近期笔者在学习 web 渗透测试的相关内容&#xff0c;主要是为了公司之后的安全产品服务。渗透测试本身在学习过程中还是很有意思的&#xff0c;有一种学习到了之前想学但是没学的黑客技术的感觉&#xff0c;并且对笔者已掌握的许多知识做了有益的补充。要学习渗透测试&…

ThinkPHP 对接美团大众点评团购券(门票)

一、功能简要介绍 1、根据需求&#xff0c;用户在美团大众点评中所购买的门票在自己的系统上可以核销&#xff0c;同时把核销信息存储到自己的系统里。2、美团点评API文档地址&#xff1a;[https://open.dianping.com/document/v2?rootDocId5000](https://open.dianping.com/…

PostgreSQL13.1

目录 1. PostgreSQL简介1.1 PostgreSQL是什么&#xff1f;1.2 PostgreSQL数据库的优缺点是什么&#xff1f;1.2.1 PostgreSQL的主要优点如下&#xff1a;1.2.2 PostgreSQL的应用劣势如下&#xff1a; 1.3 PostgreSQL不同大版本之间的特性比较1.4OpenGauss与PostgreSQL的对比1.4…

管理类联考——逻辑——知识篇——分析推理——三、分组——haimian

分组 题型特征 题干给出5-7个对象和2-5个限制条件&#xff0c;需根据题干要求分为2~3组。要注意题干中需分为几组&#xff0c;每组几个对象&#xff0c;对象有哪些限制因素&#xff0c;并灵活运用排除法、假设法、分析法、数字法、假言命题性质等方法解题。 思维导图 思路点…

技术管理第三板斧招聘与解聘-找到人

1.人才要自己去找、去抢 从团队的角度出发&#xff0c;Leader“主动出击、寻找合适人选”的观念符合逻辑&#xff0c;你既然是团队的一号位&#xff0c;自然最应该了解团队现状&#xff0c;以及团队需要的人选。与此同时&#xff0c;找到合适的人对你的影响最大而非 HR&#x…

大势智慧软硬件技术答疑第四期

1.重建大师是否支持bigmap绘制的范围线&#xff1f; 答&#xff1a;目前重建大师仅支持面格式的&#xff0c;bigmap的还没试验过&#xff0c;globalmapper或者arcgis是可以的。 2.为什么6.1建模的时候引擎一直是等待呢&#xff1f; 答&#xff1a;检查一下引擎面板引擎监控目录…

软件测试人员应该如何介绍自己测试过的项目工作【商城项目实战讲解】

测试人员在找工作的过程中&#xff0c;通常有一个问题是很难绕开的。就是要如何向别人介绍自己之前做过的项目。下面我们就这个问题简单的做一些分析。 要解决这个问题&#xff0c;大体上可以分为如下几个步骤&#xff1a; 1、对项目进行基本介绍 2、说明自己负责测试的模块 …

vue-router之hash与history,以及nginx配置

本篇讲解前端项目的路由模式&#xff08;以vue-router为例&#xff09;&#xff0c;以及history模式下的项目部署问题。 vue-router的路由模式可以通过指定mode属性值控制&#xff0c;可选值&#xff1a;“hash” 、“history”、 “abstract” &#xff0c; 默认&#xff1a;“…

一篇文章告诉你什么是—Selenium的元素等待

前言 今天我们来说说selenium的元素等待&#xff0c;废话不多说直接开始吧。 1、元素等待介绍 WebDriver定位页面元素时如果未找到&#xff0c;会在指定时间内一直等待的过程。为了保证脚本运行的稳定性&#xff0c;需要脚本中添加等待时间。 2、为什么要设置元素等待 在元…