c++生成DLL文件(visual studio 2019)面向小白萌新

c++生成DLL文件(visual studio 2019)面向小白萌新

前言

因为项目需求吧,自己需要将c++生成DLL文件给其他人调用。CSDN里的搜索了下很多写的也很基础,可惜没找到很合适的面向小白萌新的。因此个人写个相当保姆级的教程,只需要一步步跟着做就行。做完应该也就懂了。
该博客内容也就是如何把函数变为DLL文件给别人调用。参考文章是《VisualStudio2019 DLL生成并使用教程(C++)最详细Demo教程》:https://www.pianshen.com/article/2568372188/

如何生成

1.创建dll项目

新建项目,选择“动态链接库(DLL)”,接着点击下一步。
在这里插入图片描述
然后配置新项目,项目名称我写的是“Dll3”,以及“将解决方案和项目放在同一目录中”那里打勾,接着点“创建”。注意记着位置,避免生成之后找不到
在这里插入图片描述

2.更改我们的头文件和源文件

上面创建完了之后,你会得到这样的头文件和源文件。
在这里插入图片描述
里面的内容分别是(里面原先的内容不重要哈,扫一眼就好
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
接下来的就重要了
首先我们改源文件里的“dllmain.cpp”
将先前的“dllmain.cpp”里的内容删光。换为我们需要的方程,这里用的例子如下(加减乘除)。

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"

int add(int a, int b)
{
    
    
	return a + b;
}

int minus(int a, int b)
{
    
    
	return a - b;
}

int multiply(int a, int b)
{
    
    
	return a * b;
}

double divide(int a, int b)
{
    
    
	double m = (double)a / b;
	return m;
}

改完后如图
在这里插入图片描述
我们改头文件里的“pch.h”
将先前的“pch.h”里的内容删光。换为我们需要的如下。

// pch.h: 这是预编译标头文件。
// 下方列出的文件仅编译一次,提高了将来生成的生成性能。
// 这还将影响 IntelliSense 性能,包括代码完成和许多代码浏览功能。
// 但是,如果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。
// 请勿在此处添加要频繁更新的文件,这将使得性能优势无效。

#ifndef PCH_H
#define PCH_H

// 添加要在此处预编译的标头
#include "framework.h"

#endif //PCH_H

//定义宏
#ifdef IMPORT_DLL
#else
#define IMPORT_DLL extern "C" _declspec(dllimport) //指的是允许将其给外部调用
#endif

IMPORT_DLL int add(int a, int b);
IMPORT_DLL int minus(int a, int b);
IMPORT_DLL int multiply(int a, int b);
IMPORT_DLL double divide(int a, int b);

如图
在这里插入图片描述
框的这一部分就是我们的函数了。

3.生成DLL文件,找到我们的DLL文件。

右键我们的项目,点击生成。
在这里插入图片描述
接着成功了,我们继续哈。至于为啥链接不一致,暂时先不管。
在这里插入图片描述
接着我们去我们的项目位置的那去找,我的是在“C:\Users\Administrator\source\repos\Dll3\Debug”,如图,(找不到的就去第一步那个位置那里的项目的debug目录里找,看生成dll文件)
在这里插入图片描述
到这里就算生成好了。接着就是验证咱们生成的DLL文件能不能用

如何调用(验证我们生成的DLL文件)

创建一个新项目
在这里插入图片描述
名字我叫它,“use_dll3”。
然后新建一个源文件,内容为

#include <iostream>
#include <windows.h>

int main() {
    
    
	HINSTANCE hDllInst;
	hDllInst = LoadLibrary(L"C:\\Users\\Administrator\\source\\repos\\Dll3\\Debug\\Dll3.dll"); //调用DLL
	typedef int(*PLUSFUNC)(int a, int b); //后边为参数,前面为返回值
	PLUSFUNC plus_str = (PLUSFUNC)GetProcAddress(hDllInst, "add"); //GetProcAddress为获取该函数的地址
	std::cout << plus_str(1, 2);
}

如图
在这里插入图片描述
这里调用的是“add”,结果是
在这里插入图片描述
我们生成的DLL里面实际上有四个函数,加减乘除,如果你想调用其他的,把第八行的“add”换成对应的就好,如我想调用乘,那么我就把“add”换为“multiply”。更改后代码及结果就是如图。
在这里插入图片描述
在这里插入图片描述
这里的调用方法参考的是《C++中dll的生成与使用》里的第三部分“dll的使用”里的方法2:显式链接方式加载dll。:https://blog.csdn.net/qq_33414271/article/details/79534763?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161784417616780271522560%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=161784417616780271522560&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-5-79534763.pc_search_result_cache&utm_term=%E5%B0%86c%2B%2B%E7%BC%96%E8%AF%91%E4%B8%BAdll

补充知识拓展

这里就照抄上面提到的《C++中dll的生成与使用》里的内容吧。

动态链接库(dll)概述

在实际编程中,我们可以把完成某项功能的函数放在一个动态链接库里,然后提供给其他程序调用。像Windows API中所有的函数都包含在dll中,如Kernel32.dll, User32.dll, GDI32.dll等。那么dll究竟有什么好处呢?

静态库和动态库

静态库:函数和数据被编译进一个二进制文件(扩展名通常为.lib),在使用静态库的情况下,在编译链接可执行文件时,链接器从静态库中复制这些函数和数据,并把它们和应用程序的其他模块组合起来创建最终的可执行文件(.exe)。当发布产品时,只需要发布这个可执行文件,并不需要发布被使用的静态库。

动态库:在使用动态库时,往往提供两个文件:一个引入库(.lib,非必须)和一个.dll文件。这里的引入库和静态库文件虽然扩展名都是.lib,但是有着本质上的区别,对于一个动态链接库来说,其引入库文件包含该动态库导出的函数和变量的符号名,而.dll文件包含该动态库实际的函数和数据。

使用动态链接库的好处

可以使用多种编程语言编写:比如我们可以用VC++编写dll,然后在VB编写的程序中调用它。
增强产品功能:可以通过开发新的dll取代产品原有的dll,达到增强产品性能的目的。比如我们看到很多产品踢动了界面插件功能,允许用户动态地更换程序的界面,这就可以通过更换界面dll来实现。
提供二次开发的平台:用户可以单独利用dll调用其中实现的功能,来完成其他应用,实现二次开发。
节省内存:如果多个应用程序使用同一个dll,该dll的页面只需要存入内存一次,所有的应用程序都可以共享它的页面,从而节省内存。

结束语

终于写完了,记录了一下自己是怎么解决这个问题的,希望可以帮到各位。
如果你们有任何的问题或者不明白的,都可以在评论里发出来,使这篇博客可以帮到更多的人。
有帮助就点个赞和关注咯。感谢各位。
西瓜6的啦啦啦

猜你喜欢

转载自blog.csdn.net/qq_37924224/article/details/115524682