C++ 如何封装代码成DLL 动态链接库供其他项目或编程语言使用
C++ 封装代码成动态链接库DLL,并进行调用
在一些应用中,我们需要将C++代码封装成dll以供其他项目或编程语言使用。下面直接进入主题,使用VS将C++代码封装成DLL。
1 创建DLL工程
环境:VS2022
打开VS,创建新项目,选择动态链接库。
工程名根据自己的实际需求进行定义。本实例中, 工程名为DataTestDLL,如下图所示。
创建好工程后,删除工程里面自带的文件,添加自己的代码文件与对应的头文件。本实例中,删除VS自动生成的文件后,添加了DataTestDLL.cpp文件及对应的DataTestDLL.h头文件。
2 编辑代码
给头文件添加需要实现的函数声明,给CPP文件添加具体实现。
2.1 DataTestDLL.h内容如下:
#pragma once
#ifdef COM_API
#else
#define COM_API __declspec(dllexport)
#endif // COM_API
#ifdef __cplusplus
extern "C" {
#endif
COM_API void COM_PrintHello();
// 返回值为int
COM_API int COM_Add(int a, int b);
#ifdef __cplusplus
}
#endif // __cplusplus
其中,__declspec是Microsoft VC中专用的关键字,它配合着一些属性可以对标准C/C++进行扩充。__declspec关键字应该出现在声明的前面。
__declspec(dllexport)用于Windows中的动态库中,声明导出函数、类、对象等供外面调用,省略给出.def文件。即将函数、类等声明为导出函数,供其它程序调用,作为动态库的对外接口函数、类等。另外还有dllimport, dllimport是在外部程序需要使用DLL内相关内容时使用的关键字。当一个外部程序要使用DLL 内部代码(类,函数,全局变量)时,只需要在程序内部使用(dllimport)关键字声明需要使用的代码就可以了,即(dllimport)关键字是在外部程序需要使用DLL内部相关内容的时候才使用。更多内容可自行查阅资料。
2.2 DataTestDLL.cpp内容如下:
#include "DataTestDLL.h"
#include <iostream>
COM_API void COM_PrintHello()
{
std::cout << "Hello World from DLL!\n";
}
COM_API int COM_Add(int a, int b)
{
return a + b;
}
2.3 预编译头配置
以上内容为代码全部内容,如果直接运行,会报:error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include “pch.h“”?
这是因为我们删除了VS自动生成的相关代码,而此类代码在预编译头文件中用到,接下来对工程进行配置。配置工程不使用预编译头。如下所示:
2.4 生成DLL文件
完成以上工作后,生成代码,我们会发现在debug文件中,生成了DataTestDLL.dll和DataTestDLL.lib文件。至此,动态链接库封装完成。在实际应用中,要注意配置debug和release版本。
3 调用测试
解下来继续创建C++工程,测试生成的dll文件是否能够被调用。创建一个简单的控制台空项目,如下图所示:
3.1 添加dll文件至工程
将节2中生成的DataTestDLL.dll和DataTestDLL.lib 以及DataTestDLL.h三个文件拷贝至C++工程的引用目录下,本实例中单独建立一个dll引用文件夹MyDLL,如里面内容下图所示:
3.2 配置项目引用
配置包含路径:
配置库目录:
配置库文件:
添加头文件引用:
3.3 C++源文件进行代码引用
源文件ConsoleApplication1.cpp的代码如下:
#include <iostream>
#include "DataTestDLL.h"
int main()
{
std::cout << "Hello World!\n";
COM_PrintHello();
}
其中源文件输出“hello World!”, 而调用的DLL的COM_PrintHello()则输出节2.2 中的“Hello World from DLL!”。运行代码查看输出结果:
查看输出结果,调用成功。
4 总结
本文介绍了如何封装C++代码为动态链接库DLL文件,介绍了如果配置工程及调用。实例DLL中有两个函数,一个是无参无返回值的打印函数,另外一个为有参,有返回值的函数,第二个函数我们留在C# 如何调用C++ DLL文件中。