赞
踩
在应用程序设置窗口中,选择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这两个文件。
这里会有几个坑,和大家分享一下:
error C4996: ‘strcpy’: This function or variable may be unsafe.error
此时可以将strcpy,fopen改成strcpy_s和fopen_s。或者在项目属性中的C/C++,预处理器中的预处理器定义里添加_CRT_SECURE_NO_WARNINGS。[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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。