C++动态链接库(DLL)的创建及调用
1. 动态链接库生成
- 在新建项目中选择Visual C++,并且选择Win32控制台应用程序,填写项目名称,这里我把这个工程的名称名命为“dllExample.cpp”。点击确定。
进入下一个页面,点击下一步。
在应用程序设置窗口中,选择DLL以及预编译头,点击完成。
新建一个header文件,这里我取名为dllExample.h。输入以下内容。
// dllExample.h
#pragma once
#define DLLEXAMPLE_EXPORT_API __declspec(dllexport)
extern "C" DLLEXAMPLE_EXPORT_API int add(int a, int b);
#pragma once代表该文件只编译依次,不进行重复编译。
#define DLLEXAMPLE_EXPORT_API __declspec(dllexport)定义了一个名为DLLEXAMPLE_EXPORT_API的宏,这个宏代表__declspec(dllexport)。__declspec(dllexport)的作用是告诉编译器哪个函数是可以被外部访问的。
下一行代码中的 extern “C” 代表该接口可以被c++以外的语言待用使用。
下面新建一个dllExample.cpp的文件,用来实现add函数。
// dllExample.cpp : 定义 DLL 应用程序的导出函数。
//
#include "stdafx.h"
#include "dllExample.h"
int add(int a, int b) {
return a + b;
}
右击工程,点击生成。
如果生成成功可以看到下面的结果。
在上述的debug或者release目录下可以看到生成的文件,下面我们主要会使用dllExample.dll和dllExample.lib这两个文件。
这里会有几个坑,和大家分享一下:
- 生成dll文件时,不要点击运行,会跳出如下窗口报错。
- 注意你要生成的dll文件是debug还是release,是x86还是x64,在app调用时需要匹配一致。如果需要修改,可以在下面的选框里修改。
- 生成的.dll文件在工程目录下的目录下的debug或者release目录下(工程下面有两个debug/release目录,不要搞错了)。如果是x64在工程目录下会有一个x64的目录下面,x64目录会有debug或者release的目录。
- #include "stdafx.h"主要用于预编译[1],必须放在最前面。
- 如果在编译中出现了strcpy,fopen等函数,可能会导致栈溢出,因此会报错。
error C4996: ‘strcpy’: This function or variable may be unsafe.error
此时可以将strcpy,fopen改成strcpy_s和fopen_s。或者在项目属性中的C/C++,预处理器中的预处理器定义里添加_CRT_SECURE_NO_WARNINGS。[2]
2. 动态链接库的调用
调用dll库需要新建一个新的工程,点击Visual C++中的Win32控制台应用程序,并且将其名命为dllClient。
在应用程序类型中选择控制台应用程序,附加选项中选择预编译头,完全开发生命周期(SDL)检查( C )。点击完成。
在项目中的源文件中,新建一个dllclient.cpp的文件。
// dllClient.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "dllExample.h"
#include <iostream>
using namespace std;
int main()
{
int a = 1;
int b = 2;
int c = add(a, b);
cout << "1 + 2 = " << c << endl;
return 0;
}
现在在#include"dllExample.h"的#include下会有一个红色下划线,如下图所示。这是因为include默认的目录下无法找到dllExample.h及其关联文件。
一般有以下三种方法:
方法1 --直接将文件拷贝到目录下
这里读者可以直接把dllExample.h,dllExample.lib和dllExample.dll文件,复制到dllclient的工程目录下面,在上述代码的using namespace std;下面添加一句
#pragma comment(lib, “dllExample.lib”)
点击运行可以得到如下结果。
方法2 --设置C/C++的附加库目录
如果文件依赖较多,不方便直接拷贝到工程目录下,可以在工程目录下进行如下操作:
首先在工程属性中的C/C++,常规,附加包含目录,中将dllExample.h文件的所在路径添加进去。这里需要注意的是配置选项中的debug/release以及平台x64或者x86需要与编译时的选项一致。
在链接器,常规里的附加库目录里添加dllExample.lib的所在路径。
在链接器,输入里的附加依赖项里添加dllExample.lib。
在生成事件,后期生成事件里的命令行里添加以下命令。
xcopy /y /d “/dir/dllExample.dll”
/dir为实际的dll文件所在的路径。
方法3 --在VC目录中设置
如果整个工程只有C++文件。可以直接在VC目录里设置。
在VC++目录下的包含目录里添加dllExample.h所在的路径,在库目录里添加dllExmaple.lib所在的路径。
在链接器,输入里的附加依赖项里添加dllExample.lib。
在生成事件,后期生成事件里的命令行里添加以下命令。
xcopy /y /d “/dir/dllExample.dll”
/dir为实际的dll文件所在的路径。
[1] https://blog.csdn.net/sinat_36053757/article/details/71265257
[2] https://blog.csdn.net/u010182186/article/details/74936224