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;
}
随后点击菜单栏点击“生成”->“生成解决方案”,结果如下就是生成成功了。
方法二:不修改默认生成的四个文件,而是新建一个“smp.h”文件放置生成代码和一个"Source.def"文件。这样生成的dll文件引用时,就可以#include“smp.h”。
“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文件。直接新建一个,文件内容不用任何修改。
属性修改部分:
菜单”项目“->"属性管理器"->"C/C++"->"预处理器“->"预处理器定义"添加预编译头的#ifdef 后的”Smpclass_EXPORTS“
之后和第一种方法一样生成解决方案就行。
补充一句就是,生成的dll和平台有关,可以选择debug/release 以及X64/X86;同时可以选择不同的平台工具集。
1. 包含头文件目录
2. 包含lib文件目录
3. 链接器附加依赖项,添加lib文件
4. 将dll文件复制到所需项目的文件中
以上述第二种方法生成的dll项目,项目名”Dll3“, 举例说明如下:
头文件目录:”smp.h“所在的路径,”{你的项目路径}/Dll3“
lib文件目录:"Dll.lib"所在的路径,”{你的项目路径}\Dll3\x64\Release“
新建的引用项目文件目录:
引用代码如下:
#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;
}