编译链接后执行程序,控制台成功输出如下:
以下说明程序中几个应该注意的地方:
1、该 Dll "例子 导出了 一个普通的函数 和 一个 C++类,其中到处的普通的函数的声明如下
extern "C" _declspec(dllexport) int add(int a, int b);
前面多了 extern "C" 声明,该声明的作用是这样的,它可以在动态链接库文件编译时,到处的函数的名称不要发生改变,从而可以解决不同的编译器在进行 C++ 和 C 语言之间相互调用时函数命名的问题,但它不适用于一个类的成员函数,所以在声明类是,我没有加上这个声明。
2、读者可以试一下把程序中 _declspec(dllexport) 替换成 _declspec(dllimport),然后再重新生成 *.Dll 和 *.lib ,同时要记得把新生成的这两个文件覆盖之前另一个工程的 *.Dll 和 *.lib ,然后在重新编译程序,可以发现,程序也能正常执行。
出现这种情况是否就意味着这两个声明可以互换使用呢?答案当然不是,只是有些情况下确实可以互换使用,但不是所有的情况都如此。
以下是我在网上搜索到的对这两个声明的解释:
__declspec(dllexport)
声明一个导出函数,是说这个函数要从本DLL导出。我要给别人用。一般用于dll中省掉在DEF文件中手工定义导出哪些函数的一个方法。当然,如果你的DLL里全是C++的类的话,你无法在DEF里指定导出的函数,只能用__declspec(dllexport)导出类。
__declspec(dllimport)
声明一个导入函数,是说这个函数是从别的DLL导入。我要用。一般用于使用某个dll的exe中 不使用 __declspec(dllimport) 也能正确编译代码,但使用 __declspec(dllimport) 使编译器可以生成更好的代码。编译器之所以能够生成更好的代码,是因为它可以确定函数是否存在于 DLL 中,这使得编译器可以生成跳过间接寻址级别的代码,而这些代码通常会出现在跨 DLL 边界的函数调用中。但是,必须使用 __declspec(dllimport) 才能导入 DLL 中使用的变量。
大家参考一下就行,若真想知道为什么,我还是建议大家有时间的话上MSDN上面了解比较好!