此篇仅作简要的记录,作为备忘。
更为详细的可以参考:[url]http://www.cnblogs.com/houkai/archive/2013/06/05/3119513.html[/url]
[url]http://blog.youkuaiyun.com/ixsea/article/details/6676802[/url]
MS关于DLL的文档目录:[url]http://msdn.microsoft.com/zh-cn/library/1ez7dh12.aspx[/url]
[color=blue][size=large]1、DLL的创建[/size][/color]
官方文档:[url]http://msdn.microsoft.com/zh-cn/library/ms235636.aspx[/url]
在VS中新建DLL工程,定义
接下来,我们在创建DLL的工程中定义[b]CREATEDLL_API[/b],方法为:在工程属性页面下图所示位置加上CREATEDLL_API:
[img]http://dl2.iteye.com/upload/attachment/0101/6205/aa9621b0-56b9-329b-a652-2dc7d17b268a.png[/img]
对于需要导出的函数(声明和定义两处都要),要这么写:
由于定义了[b]CREATEDLL_API[/b],相当于声明了:
表明我们现在是要导出该函数funcA。写好函数后就可以编译了。
编译好之后,会生成 对应的lib文件和DLL文件。
[color=blue][size=large]2、DLL的使用[/size][/color]
[color=red]注意:[/color]程序运行时需要将DLL拷贝到程序所在目录,或者将DLL目录添加到环境变量Path中(添加完成后需要重启)。
[color=blue]方法1:隐式链接 Linking Implicitly[/color]
[url]http://msdn.microsoft.com/zh-cn/library/d14wsce5.aspx[/url]
将之前写的头文件加入工程,该工程不要定义[b]CREATEDLL_API[/b]。
将生成的lib文件所在路径添加到工程的libarary directory中就可以编译了。
这里想多说一点的是:如果按我上面的头文件写法,编译器会自动选择对应的lib文件。无需在工程属性的linker->Input下手动输入要引入的lib文件了。
当然,前提是需要手动将DLL工程的输出DLL文件名进行更名,64位版本加了X64后缀,32位版本加了X86后缀。如下图所示:
[img]http://dl2.iteye.com/upload/attachment/0101/6209/2481fd1e-fbd6-33b4-bf70-d9b1a89d6f5a.png[/img]
[color=blue]方法2:显式链接 Linking Explicitly[/color]
[url]http://msdn.microsoft.com/zh-cn/library/784bt7z7.aspx[/url]
参考官方文档或者之前给出的博文吧!
过程主要为:
LoadLibray 载入DLL
GetProcAddress 获取函数地址
使用函数句柄
FreeLibrary 释放DLL资源
[color=blue][size=large]3、查看DLL中经过修饰的函数名[/size][/color]
[url]http://msdn.microsoft.com/zh-cn/library/756as972.aspx[/url]
C++中会对函数名进行修饰,如果用显式链接,直接使用原始函数名会出现问题!
可以通过dumpbin工具进行查看:
方法为,从开始菜单中打开[color=red][b]VS的command prompt[/b][/color],在命令行环境下输入以下命令,就可以看到导出的函数名了:
由于我使用隐式调用,这里不再深究
更为详细的可以参考:[url]http://www.cnblogs.com/houkai/archive/2013/06/05/3119513.html[/url]
[url]http://blog.youkuaiyun.com/ixsea/article/details/6676802[/url]
MS关于DLL的文档目录:[url]http://msdn.microsoft.com/zh-cn/library/1ez7dh12.aspx[/url]
[color=blue][size=large]1、DLL的创建[/size][/color]
官方文档:[url]http://msdn.microsoft.com/zh-cn/library/ms235636.aspx[/url]
在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的工程中定义[b]CREATEDLL_API[/b],方法为:在工程属性页面下图所示位置加上CREATEDLL_API:
[img]http://dl2.iteye.com/upload/attachment/0101/6205/aa9621b0-56b9-329b-a652-2dc7d17b268a.png[/img]
对于需要导出的函数(声明和定义两处都要),要这么写:
CREATEDLL_API int funcA(int a=1);
由于定义了[b]CREATEDLL_API[/b],相当于声明了:
__declspec(dllexport) int funcA(int a=1);
表明我们现在是要导出该函数funcA。写好函数后就可以编译了。
编译好之后,会生成 对应的lib文件和DLL文件。
[color=blue][size=large]2、DLL的使用[/size][/color]
[color=red]注意:[/color]程序运行时需要将DLL拷贝到程序所在目录,或者将DLL目录添加到环境变量Path中(添加完成后需要重启)。
[color=blue]方法1:隐式链接 Linking Implicitly[/color]
[url]http://msdn.microsoft.com/zh-cn/library/d14wsce5.aspx[/url]
将之前写的头文件加入工程,该工程不要定义[b]CREATEDLL_API[/b]。
将生成的lib文件所在路径添加到工程的libarary directory中就可以编译了。
这里想多说一点的是:如果按我上面的头文件写法,编译器会自动选择对应的lib文件。无需在工程属性的linker->Input下手动输入要引入的lib文件了。
当然,前提是需要手动将DLL工程的输出DLL文件名进行更名,64位版本加了X64后缀,32位版本加了X86后缀。如下图所示:
[img]http://dl2.iteye.com/upload/attachment/0101/6209/2481fd1e-fbd6-33b4-bf70-d9b1a89d6f5a.png[/img]
[color=blue]方法2:显式链接 Linking Explicitly[/color]
[url]http://msdn.microsoft.com/zh-cn/library/784bt7z7.aspx[/url]
参考官方文档或者之前给出的博文吧!
过程主要为:
LoadLibray 载入DLL
GetProcAddress 获取函数地址
使用函数句柄
FreeLibrary 释放DLL资源
[color=blue][size=large]3、查看DLL中经过修饰的函数名[/size][/color]
[url]http://msdn.microsoft.com/zh-cn/library/756as972.aspx[/url]
C++中会对函数名进行修饰,如果用显式链接,直接使用原始函数名会出现问题!
可以通过dumpbin工具进行查看:
方法为,从开始菜单中打开[color=red][b]VS的command prompt[/b][/color],在命令行环境下输入以下命令,就可以看到导出的函数名了:
dumpbin /exports ./x64/Release/LBFGS_alglibDLLX64.dll
由于我使用隐式调用,这里不再深究