VS2019编译生成动态链接库dll的两种方式

第一步:创建“动态链接库(DLL)”项目

VS2019编译生成动态链接库dll的两种方式_第1张图片

 dll项目的默认结构如下:

VS2019编译生成动态链接库dll的两种方式_第2张图片

 四个文件的内容因为是默认生成的,不是特别重要,接下来就是重要的修改部分:

第二步:将自己的类定义函数或者函数迁移到dll项目中

方法一:修改“pch.h”和“dllmain.cpp”文件,可以参考以下博主链接,但博主的引用部分有些繁琐,文末会介绍我的引用方法,和正常引用外部库步骤是一样的。这个方法的优点是编译简单,很顺利生成dll和lib文件。但是引用时,需要#include"pch.h",在不修改pch名称的条件下,生成多个dll后,引用时可能会有些冲突。具体的引用操作,文章最后会介绍。

(30条消息) c++生成DLL文件(visual studio 2019)面向小白萌新_西瓜6的博客-CSDN博客_c++生成dll

这里贴上我的代码,将以上博主的函数封装成类。

“pch.h”,补充了两部分,一个是预编译的标头,一个就是预编译函数的头文件。

其中关键的一点是,在类名前加上“SimpleCal_API”,这个名称可以随意修改。

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

#ifndef PCH_H
#define PCH_H

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

#endif //PCH_H

#define SimpleCal_API ;
#ifdef SimpleCal_EXPORTS
#define SimpleCal_API __declspec(dllexport)
#else
#define SimpleCal_API __declspec(dllimport)
#endif


class SimpleCal_API Mycal {

public:
	int my_add(int a, int b);

	int my_minus(int a, int b);

	int my_multiply(int a, int b);

	double my_divide(int a, int b);
};

“dllmain.cpp”,删除了默认的内容,补充了预编译函数的源文件。

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

int Mycal::my_add(int a, int b) {
	return  a + b;
}

int Mycal::my_minus(int a, int b)
{
	return a - b;
}

int Mycal::my_multiply(int a, int b)
{
	return a * b;
}

double Mycal::my_divide(int a, int b)
{
	double m = (double)a / b;
	return m;
}

随后点击菜单栏点击“生成”->“生成解决方案”,结果如下就是生成成功了。

VS2019编译生成动态链接库dll的两种方式_第3张图片

 方法二:不修改默认生成的四个文件,而是新建一个“smp.h”文件放置生成代码和一个"Source.def"文件。这样生成的dll文件引用时,就可以#include“smp.h”。

VS2019编译生成动态链接库dll的两种方式_第4张图片

“smp.h”文件,对于大的项目代码,也可以拆为一个头文件和一个源文件,注意“Smpclass_API”的添加就行。

#pragma once

#define Smpclass_API ; //Don't forget to add before class if build dll
#ifdef Smpclass_EXPORTS
#define Smpclass_API __declspec(dllexport)
#else
#define Smpclass_API __declspec(dllimport)
#endif

 class Smpclass_API Mycal {

	public:
		int my_add(int a, int b) {
		return  a + b;
		}

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

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

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

"Source.def"模块定义文件,作用是如果不添加,无法生成lib文件。直接新建一个,文件内容不用任何修改。

VS2019编译生成动态链接库dll的两种方式_第5张图片

 属性修改部分:

菜单”项目“->"属性管理器"->"C/C++"->"预处理器“->"预处理器定义"添加预编译头的#ifdef 后的”Smpclass_EXPORTS

VS2019编译生成动态链接库dll的两种方式_第6张图片

 之后和第一种方法一样生成解决方案就行。

补充一句就是,生成的dll和平台有关,可以选择debug/release 以及X64/X86;同时可以选择不同的平台工具集。

VS2019编译生成动态链接库dll的两种方式_第7张图片

 第三步:新建项目引用自生成的dll文件

1. 包含头文件目录

2. 包含lib文件目录

3. 链接器附加依赖项,添加lib文件

4. 将dll文件复制到所需项目的文件中

以上述第二种方法生成的dll项目,项目名”Dll3“, 举例说明如下:

头文件目录:”smp.h“所在的路径,”{你的项目路径}/Dll3“

lib文件目录:"Dll.lib"所在的路径,”{你的项目路径}\Dll3\x64\Release“

VS2019编译生成动态链接库dll的两种方式_第8张图片

VS2019编译生成动态链接库dll的两种方式_第9张图片

新建的引用项目文件目录:

 VS2019编译生成动态链接库dll的两种方式_第10张图片 

引用代码如下:

#include "smp.h"
#include 


int main() {

	Mycal cal;
	int a = 1;
	int b = 2;
	int c = cal.my_add(a, b);
	std::cout << c << std::endl;
	return 0;

}

你可能感兴趣的:(c++,windows)