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

news/2025/2/14 0:56:00/

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_EXPORTSnamespace MathLibrary {class MATHLIBRARY_API Arithmetic{public:Arithmetic();~Arithmetic();// Returns a + bdouble Add(double a, double b);// Returns a - bdouble Subtract(double a, double b);// Returns a * bdouble Multiply(double a, double b);// Returns a / bdouble 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 oncenamespace MathLibrary {class Arithmetic{public:Arithmetic();~Arithmetic();// Returns a + bstatic double Add(double a, double b);// Returns a - bstatic double Subtract(double a, double b);// Returns a * bstatic double Multiply(double a, double b);// Returns a / bstatic 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.ppmy.cn/news/587252.html

相关文章

VSCode自定义个性化console.log,快捷打印

最终效果&#xff0c;通过Ctrl Alt l快捷键打印选中值 如何自定义Console.log样式&#xff1f; 可以使用 %c 为打印内容定义样式&#xff1a; console.log("This is %cMy stylish message", "color: yellow; font-style: italic; background-color: blue;pa…

如何搭建云服务器?

要搭建云服务器&#xff0c;你需要以下步骤&#xff1a; 选择一个云服务提供商&#xff0c;比如 Amazon Web Services (AWS)、Microsoft Azure 或 Google Cloud Platform。 注册一个账号并登录。 选择你需要的云服务器类型&#xff0c;比如虚拟机 (VM) 或容器。 选择操作系统和…

如何搭建个人服务器

搭建个人服务器需要以下步骤&#xff1a; 1.选择合适的服务器硬件和操作系统&#xff1a;根据你的需求和预算&#xff0c;选择一台适合的服务器硬件&#xff0c;如CPU、内存、硬盘等&#xff0c;并安装合适的操作系统&#xff0c;如Linux、Windows等。 2.选择合适的服务器软件&…

一、服务器搭建

1、客户/服务器架构 对于客户机和服务器之间通信必然存在有个统一的通信端口&#xff0c;客户机通过该通信端口进行与服务器进行通信&#xff0c;传递执行命令&#xff0c;服务器进行处理后将执行的结果反馈给客户端&#xff0c;比喻成一家公司的话&#xff0c;客户就是客户端&…

如何自己搭建服务器

搭建服务器分为3步&#xff1a; 1、环境搭建部署&#xff0c;需要选择自己熟悉的环境、选择数据库以及应用中间件&#xff1b; 2、网站应用部署&#xff0c;这一步需要新创建一个网站应用&#xff0c;并配置为本地自己的网站应用目录&#xff1b; 3、网站发布&#xff0c;启…

WWW服务器搭建

状态代码由三位数字组成&#xff0c;第一个数字定义了响应的类别&#xff0c;且有五种可能取值。 1xx&#xff1a;指示信息 —— 表示请求已接收&#xff0c;继续处理。 2xx&#xff1a;成功 —— 表示请求已被成功接收、理解、接受。 3xx&#xff1a;重定向 —— 要完成请求必…

服务器部署服务

1.购买云服务器 阿里&#xff1a;爆款云产品&#xff0c;新客特惠全年最低价&#xff0c;云服务器低至0.4折起 https://www.aliyun.com/activity/1111?userCodeq88dydwd 腾讯&#xff1a;【腾讯云】爆款1核2G云服务器首年48元&#xff0c;还有iPad Pro、Bose耳机、京东卡等你…

服务器架设

2017.03.20 .ssh目录下的known。。。文件 表示信任主机 修改sshd配置文件 /etc/ssh/sshd 查找port信息 /port 开启服务后&#xff0c;设置防火墙&#xff08;永久生效&#xff09; 重启后设置安全上下文 2017.03.22 NFS服务器&#xff1a; NFS网络文件系统&#xff08;基于网络…