首页 > 系统相关 >Windows下C++动态链接库的生成以及使用

Windows下C++动态链接库的生成以及使用

时间:2024-07-15 18:29:25浏览次数:16  
标签:__ 项目 Windows DEMO declspec C++ DLL 动态链接库 dll

目录

一.前言

这篇文章简单讨论一下Windows下如何使用VS生成和使用C++动态链接库,示例使用VS2022环境。

二.生成动态链接库

先创建C++项目-动态链接库(DLL)
在这里插入图片描述

在这里插入图片描述

然后将默认生成的.h和.cpp文件清理干净,当然你也可以选择保留。

然后创建需要的.h和.cpp文件。

在这里插入图片描述

看下代码

//dll_demo_config.h

#ifndef DLL_DEMO_CONFIG_H
#define DLL_DEMO_CONFIG_H

#ifdef DLLDEMO_EXPORTS
  #define DLL_DEMO_EXPORT __declspec(dllexport)
#else
  #define DLL_DEMO_EXPORT __declspec(dllimport)
#endif // DLLDEMO_EXPORTS

#endif // !DLL_DEMO_CONFIG_H
#ifndef DLL_DEMO_H
#define DLL_DEMO_H

#include<string>

#include"dll_demo_config.h"

class DllDemo
{
public:
	DllDemo(void) = default;
	~DllDemo(void) noexcept = default;
	DLL_DEMO_EXPORT void Print(std::string& msg);
};

#endif // !DLL_DEMO_H
//dll_demo.cpp

#include"dll_demo.h"

#include<iostream>

void DllDemo::Print(std::string& msg)
{
	std::cout << "msg:" << msg << std::endl;
}

很简单的代码,就是提供一个打印字符串的接口。

解释一下代码中的要点

#ifdef DLLDEMO_EXPORTS
  #define DLL_DEMO_EXPORT __declspec(dllexport)
#else
  #define DLL_DEMO_EXPORT __declspec(dllimport)
#endif // DLLDEMO_EXPORTS

可以看到这里有个宏是DLLDEMO_EXPORTS,那这个宏是在哪里定义的呢,其实是创建DLL项目的时候,VS自动定义好的,在项目属性-C/C+±预处理器-预处理器定义里面可以看到

在这里插入图片描述

或者在其他地方也可以看到,比如在项目属性-C/C+±命令行里面。

这个宏主要就是用来区分使用 __declspec(dllexport) 还是 __declspec(dllimport)

为什么要区分呢,简单解释一下:

  • __declspec(dllexport)用来声明将函数等导出。

  • __declspec(dllimport)用来声明函数等是从外部导入的。

  • 由于这个DLL项目定义了DLLDEMO_EXPORTS宏,所以在这个DLL项目中使用__declspec(dllexport),表示需要将相关的函数导出。

  • 而用到这个DLL库的项目由于不曾定义DLLDEMO_EXPORTS,所以在这些项目中就会使用__declspec(dllimport),表示相关函数是从外部导入的。

class DllDemo
{
public:
	DllDemo(void) = default;
	~DllDemo(void) noexcept = default;
	DLL_DEMO_EXPORT void Print(std::string& msg);
};

这里DLL_DEMO_EXPORT对Print进行修饰,就是在声明Print是需要导出还是从外部导入,在这个项目中就是导出。

解释好了,编译一下,但是这个时候你会发现项目不能编译。

报错

在这里插入图片描述

这是因为清理了生成的默认文件,需要在项目属性-C/C+±预编译头-预编译头,改为不使用预编译头就可以了。

在这里插入图片描述

编译生成了dll_demo.lib和dll_demo.dll,这样动态库生成就是完成了。

三.使用动态链接库

我们看一下怎么使用动态库,创建C++项目-空项目,编写exe程序,这个exe程序会调用动态库。

在这里插入图片描述

看下代码

//main.cpp

#include<string>

#include"dll_demo.h"

int main(int argc, char* argv[])
{
	DllDemo dllDemo;
	std::string strMsg("exe_demo");

	dllDemo.Print(strMsg);

	return 0;
}

其实就是很简单的代码。
执行结果

在这里插入图片描述

需要注意的是:

  • 需要在项目属性-C/C+±常规-附加包含目录,设置项目包含的头文件所在位置。

  • 需要在项目属性-链接器-常规-附加库目录,设置项目依赖的库文件(.lib)所在位置。

  • 需要在项目属性-链接器-输入-附加依赖项,设置项目依赖的库文件(.lib)。

  • 动态库.dll文件需要和可执行.exe文件在同一目录下。

四.其他

1.也可以使用其他的方式创建动态链接库项目,比如创建C++项目-Windows桌面向导

在这里插入图片描述

2.建议自定义配置.lib/.dll/.exe等文件的生成目录。

3.建议在解决方案-项目依赖项/项目生成顺序中指定同一个解决方案中的项目依赖规则

在这里插入图片描述

标签:__,项目,Windows,DEMO,declspec,C++,DLL,动态链接库,dll
From: https://blog.csdn.net/2401_85919417/article/details/140413616

相关文章

  • [Windows] 无需PS基础也香 Inpaint v10.2高级便携版
    描述对于经常在互联网上进行操作的学生,白领等!一款好用的软件总是能得心应手,事半功倍。今天给大家带了一款高科技软件Inpaintv10.2高级便携版无需额外付费,永久免费!亲测可运行!!内容目前主要的内容以资源破解,对于学习破解资源有比较大的帮助!但是网络上面错综复杂,很多......
  • [Windows] 油.管视频下载神器 Gihosoft TubeGet Pro v9.3.88
    描述对于经常在互联网上进行操作的学生,白领等!一款好用的软件总是能得心应手,事半功倍。今天给大家带了一款高科技软件管视频下载神器无需额外付费,永久免费!亲测可运行!!内容目前主要的内容以资源破解,对于学习破解资源有比较大的帮助!但是网络上面错综复杂,很多老旧的版......
  • [Windows] 大佬基于Splayer二次开发 TuneFree v1.0.8便携版
    描述对于经常在互联网上进行操作的学生,白领等!一款好用的软件总是能得心应手,事半功倍。今天给大家带了一款高科技软件TuneFreev1.0.8便携版无需额外付费,永久免费!亲测可运行!!内容目前主要的内容以资源破解,对于学习破解资源有比较大的帮助!但是网络上面错综复杂,很多老......
  • [Windows] 号称最快免费小巧的远程桌面 AnyDesk v8.0.11单文件版
    描述对于经常在互联网上进行操作的学生,白领等!一款好用的软件总是能得心应手,事半功倍。今天给大家带了一款高科技软件虽然QQ拥有远程协助功能,但很多时候连接并不够流畅,而且被控电脑那方也必须要有人操作才行。因此,很多人会选择TeamViewer、AnyDesk等…这样更为专业的......
  • Windows平台如何实现多路RTSP|RTMP流合成后录像或转发RTMP服务
    技术背景我们在对接Windows平台RTSP|RTMP直播播放模块的时候,有开发者提出来这样的技术需求,他们做驾考、全景摄像头、多路会议录制等场景的时候,希望把多路视频流数据,合并到一路保存或者对外推送到RTMP服务。技术实现多路RTSP|RTMP流合流,实际上我们2016年就有这块demo,当时合流......
  • 【C/C++】结构体内存对齐
    结构体内存对齐详解1、第一个成员在与结构体变量偏移量为0的地址处2、其他成员变量要偏移到对齐数的整数倍的地址处,注意偏移是从结构体首地址处开始的。对齐数取的是编译器默认的一个对齐数与该成员大小 这个俩个数中的最小值。【VS中默认的值为8、Linu......
  • 小工具:用于Windows平台的网速监控悬浮窗软件 - 用于Windows平台的网速监控悬浮窗软件
    介绍TrafficMonitor是一款用于Windows平台的网速监控悬浮窗软件,可以显示当前网速、CPU及内存利用率,支持嵌入到任务栏显示,支持更换皮肤、历史流量统计等功能。官网国内https://gitee.com/zhongyang219/TrafficMonitor全球网络https://github.com/zhongyang219/TrafficMonito......
  • pd虚拟机专用windows系统镜像(m1/intel)
    PD虚拟机专用Windows系统镜像(M1/Intel)是一款专为Mac用户设计的虚拟化软件,旨在通过ParallelsDesktop虚拟机在Mac上无缝运行Windows系统。该软件分为M1芯片和Intel芯片两个版本,高度兼容不同型号的Mac电脑。用户可以在Mac上享受到与实体计算机上运行Windows系统相同的体验,包括运行W......
  • kimi写代码:c++ 线程池
    https://kimi.moonshot.cn/share/cqaberkdvond1bljn8sg在这个示例中:线程池创建了固定数量的工作线程。enqueue方法用于将任务添加到队列,并返回一个std::future对象,可用于获取任务的结果。每个工作线程在循环中等待任务分配,并在接收到任务后执行它。当线程完成分配的任务后......
  • 面试算法(排序)附带c++/python实现
            排序算法是面试中会经常会被问到的一类问题,如果可以掌握较多的排序算法,在面试过程中才更有机会被面试官看重哦,下面我们准备了一些常见的面试算法,并分别给出了c++和python的代码实现,小伙伴们一起学起来吧!冒泡排序(BubbleSort)        基于交换的排序,......