创建及使用DLL

此篇仅作简要的记录,作为备忘。
更为详细的可以参考: http://www.cnblogs.com/houkai/archive/2013/06/05/3119513.html
http://blog.csdn.net/ixsea/article/details/6676802
MS关于DLL的文档目录: http://msdn.microsoft.com/zh-cn/library/1ez7dh12.aspx
1、DLL的创建
官方文档: http://msdn.microsoft.com/zh-cn/library/ms235636.aspx
在VS中新建DLL工程,定义
#pragma once
#ifdef CREATEDLL_EXPORTS
#define CREATEDLL_API __declspec(dllexport)
#else
#define CREATEDLL_API __declspec(dllimport)
// Check windows
#if _WIN32 || _WIN64
#if _WIN64
#pragma comment(lib,"LBFGS_alglibDLLX64.lib")
#else
#pragma comment(lib,"LBFGS_alglibDLLX86.lib")
#endif
#endif
#endif

接下来,我们在创建DLL的工程中定义 CREATEDLL_API,方法为:在工程属性页面下图所示位置加上CREATEDLL_API:
创建及使用DLL_第1张图片

对于需要导出的函数(声明和定义两处都要),要这么写:
CREATEDLL_API int funcA(int a=1);

由于定义了 CREATEDLL_API,相当于声明了:
__declspec(dllexport) int funcA(int a=1);

表明我们现在是要导出该函数funcA。写好函数后就可以编译了。
编译好之后,会生成 对应的lib文件和DLL文件。

2、DLL的使用
注意:程序运行时需要将DLL拷贝到程序所在目录,或者将DLL目录添加到环境变量Path中(添加完成后需要重启)。
方法1:隐式链接 Linking Implicitly
http://msdn.microsoft.com/zh-cn/library/d14wsce5.aspx
将之前写的头文件加入工程,该工程不要定义 CREATEDLL_API
将生成的lib文件所在路径添加到工程的libarary directory中就可以编译了。

这里想多说一点的是:如果按我上面的头文件写法,编译器会自动选择对应的lib文件。无需在工程属性的linker->Input下手动输入要引入的lib文件了。
当然,前提是需要手动将DLL工程的输出DLL文件名进行更名,64位版本加了X64后缀,32位版本加了X86后缀。如下图所示:
创建及使用DLL_第2张图片

方法2:显式链接 Linking Explicitly
http://msdn.microsoft.com/zh-cn/library/784bt7z7.aspx
参考官方文档或者之前给出的博文吧!
过程主要为:
LoadLibray 载入DLL
GetProcAddress  获取函数地址
使用函数句柄
FreeLibrary 释放DLL资源

3、查看DLL中经过修饰的函数名
http://msdn.microsoft.com/zh-cn/library/756as972.aspx
C++中会对函数名进行修饰,如果用显式链接,直接使用原始函数名会出现问题!
可以通过dumpbin工具进行查看:
方法为,从开始菜单中打开 VS的command prompt,在命令行环境下输入以下命令,就可以看到导出的函数名了:
dumpbin /exports ./x64/Release/LBFGS_alglibDLLX64.dll

由于我使用隐式调用,这里不再深究

你可能感兴趣的:(C++)