XX.exe,调用dll库,因为dll1.dll库很大,就将其拆分成一个主dll库dll1,以及一些子dll,互相都有调用,主dll在 添加子的dll中的.h后,在跑时提示加载主dll失败,如果将添加子库的.dll去掉,加载正常,主dll跟子dll库,放的位置,链接库.lib都加了,悬赏大神解决..谢谢...
调试下,首先用depandency walker看看dll是什么格式什么平台,导出函数,是否需要注册
然后用调试器调试下
myDll.h文件:
#include "myDLL_global.h"
extern "C"{
extern int MYDLL_EXPORT g_func();
}
extern int MYDLL_EXPORT g_data;
class MYDLL_EXPORT MyDLL
{
public:
MyDLL();
int data;
int func();
};
我们这里书写动态库
和 到时候外部使用这个动态库时
,都会#include这个头文件,目的是得到这些声明
但我们知道的是: 动态库声明导出时
的符号 和 外部使用导入时
的符号,是不同的 (一个是export,一个是import)
但他俩书写的位置,都是相同的,只是名字不同。
为了简便开发,不管是导出时的符号,还是导入时的符号,我们统一使用一个#define MYDLL_EXPORT
来表示
只不过,在导出时 这个define为export,在导入时 这个define为import
做法是:
在myDLL_global.h文件里,定义这个MYDLL_EXPORT
#if defined(MYDLL_LIBRARY)
# define MYDLL_EXPORT Q_DECL_EXPORT
#else
# define MYDLL_EXPORT Q_DECL_IMPORT
#endif
我们知道,在动态库这个qt项目里,我们在.pro
文件里,是define了MYDLL_LIBRARY
即,动态库编译最终生成的myDLL.h中,所有的MYDLL_EXPORT ,替换成了:Q_DECL_EXPORT
而外部使用时,编译最终生成的myDLL.h中,所有的MYDLL_EXPORT ,替换成了:Q_DECL_IMPORT
xx_global.h这个文件,他决定了,这个MYDLL_EXPORT 到底定义成什么
所以,不管是动态库开发 还是外部引用动态库,不仅要#inclue 动态库.h,还要#include 动态库_global.h
否则,你的动态库.h里用到的MYDLL_EXPORT ,他根本就没有定义,他是在动态库_global.h里定义的