今天编译/调用一个动态库折腾了很久。明明lib/dll编译成功了,但是被调用时,死活都报“函数符号找不到的”的错误。检查了好几遍lib/h文件路径设置是否ok,有无正确引用。都没有问题。来回折腾了我2个小时,最后发现原因是:导出函数定义和声明的规格不一致。为了避免犯这种低级小错误,在这里对VS编译动态库,编译的2种方法和注意事项,备忘一下。
为了能被其他程序正确调用链接,需要编译出dll动态库和相应的lib符合文件。有两种方法:
1/ 配置def文件:(linker-》input-》module define file)。
def可以同时输出dll和lib,但是dllexport方式,对C函数,经常只有dll无法生成lib,对导出类,dllexport可以生成dll和lib。
DLL中导出函数的两种方式(dllexport与.def文件):http://blog.youkuaiyun.com/lostyears/article/details/8482638
动态链接库全面浅析(一)-----Win32 动态链接库:http://blog.youkuaiyun.com/zhaodan19861107/article/details/7919359
2/关键字_declspec(dllexport)显示声明:
动态链接库导出C++类:http://blog.youkuaiyun.com/talentluke/article/details/6438049
头文件:
#ifdef _CLASSINDLL
#define CLASSINDLL_CLASS_DECL __declspec(dllexport)
#else
#define CLASSINDLL_CLASS_DECL __declspec(dllimport)
#endif
//将类声明改为:
class CLASSINDLL_CLASS_DECL CInDLL
cpp文件:在实现这个类的CPP文件的顶部加入#define _CLASSINDLL语句,然后include头文件。
#define _CLASSINDLL
#include "CInDLL.h"
这样一来在使用这个类时就可以不做任何改动了。我上面犯的错误正是因为函数实现cpp中没有包含对外头文件。