一、将 .cpp 文件编译成 .dll 文件
方法一:使用 __declspec(dllexport) 创建 dll 文件
1、创建文件夹 CreatDll
2、为该项目添加头文件 CreatDll.h
CreatDll.h 中代码如下:
#pragma once
#ifdef CREATDLL_EXPORTS
#define CREATDLL_API __declspec(dllexport)
#else
#define CREATDLL_API __declspec(dllexport)
#endif // CREATDLL_EXPORTS
extern "C" CREATDLL_API int TheAdd(int a, int b);
/*
也可以直接写成如下的形式:
extern "C" __declspec(dllexport) int TheAdd(int a, int b);
#define CREATDLL_API __declspec(dllexport) 的作用是将 __declspec(dllexport)
用标识符 CREATDLL_API 来进行表示
*/
3、为该项目添加源文件 CreatDll.cpp
CreatDll.cpp 代码如下:
#include<iostream>
#include "CreatDll.h"
int TheAdd(int a, int b){
return a + b;
}
4、将该文件编译成 .dll 文件
编译成功之后结果如下:会产生 所需要的 .dll 文件和 .lib 文件
*********************************************************************************************************************
方法二:使用模块(.def)的方式来进行生成 .dll 文件
1、创建新的项目:CreateDll02
2、打开 CreateDll02.cpp 源文件,输入代码
// CreateDll02.cpp : 定义 DLL 应用程序的导出函数。
#include "stdafx.h"
int TheAdd(int a, int b) {
return a + b*100;
}
int TheSub(int c, int d) {
return c - d;
}
3、给该工程添加一个后缀名为 .def
LIBRARY CreateDll02
EXPORTS
TheAdd @1
TheSub @2
【注意】:
- 其中LIBRARY语句用于指定动态链接库的名称,该名称与生成的 dll 文件名称一定要匹配。
- EXPORTS语句用于表明dll将要导出的函数,以及为这些导出函数指定的符号名。 可以在.def文件中的导出函数名后加 @n,如TheAdd @1,TheSub @2,表示要导出的函数顺序号。然后在C#中调用这些dll文件中的函数时,可以让 EntryPoint 属性值用该序号来代替相应的函数名。如:[DllImport("CreateDll01.dll" , EntryPoint ="#2" , CallingConvention = CallingConvention.Cdecl)] 中用序号 #2 来代替 TheSub 函数名,其原来的属性值应为:EntryPoint ="TheSub"
- 该DLL编译成功后,打开工程中的Debug目录,同样也会看到 CreateDLL02.dll 文件。
二、C++程序调用 .dll 文件
1、新建控制台应用程序的项目,来调用以上所生成的 .dll 文件
2、将已经生成的 .dll 文件和 .lib 文件复制到控制台应用程序的项目文件夹中。
3、再将 CreatDll.h 文件也复制到控制台应用程序的项目文件夹中。
4、将复制过来的 .lib 文件添加到资源文件中
5、为控制台应用程序添加源文件 CallDll.cpp ,代码如下
#include<iostream>
#include "CreatDll.h"
using namespace std;
int main()
{
int x, y;
cout << "请输入 x = ";
cin >> x;
cout << "请输入 y =";
cin >> y;
return TheAdd(x, y);
}
6、运行结果如下:
参考资料:
[1] VS2017动态链接库(.dll)的生成与使用
[2] C++编程笔记:dll的生成与使用