因为代码实际上是在使用DLL的工程里面,而不是DLL里面,所以其实和静态库没有本质区别。
但是当你在DLL中也使用了那个模板函数和模板类,情形就不同了,那些代码是在DLL中的,此时如果你使用这个DLL的工程就会有警告,让你把那些模板类导出。那就加个导出符号吧。
但是问题又来了,编译警告没有了,链接错误出现了,因为EXE工程里面使用这个模板类的代码实际上是在EXE里面的,import会导致找不到这个函数定义。
再使用宏定义大法,把DLL里的定义写成export,在EXE里把这个导出符号定义成空,程序运行正常但是,还是有编译警告,说需要留出dll接口,这个警告是在EXE里的,DLL里没有。情况发生在一个非模板类使用了一个模板成员的情形。
import也不行,空也不行,干脆改成export,这样在DLL和EXE里,模板类实际上都是__declspec(dllexport),这回一切正常了,没有编译警告,没有错误,程序运行正常。
------解决方案--------------------------------------------------------
在使用 DLL_EXPORT 的时候,表示该符号是导出的。
在使用这些到处函数的时候,不明确要求使用 DLL_IMPORT。
如果没有使用 __declspec(dllimport) ,那么该函数将直接调用。
否者,编译器会添加一个函数包装。
使用 __declspec(dllimport) 和不使用的差别就在于一个函数包装。
所以建议使用 __declspec(dllimport) 来使用导入符号。------解决方案--------------------------------------------------------不错!