在dll文件中提供了__declspec(dllimport)的函数接口,在此dll中又加载了动态库文件,被加载的动态库需要调用dll中提供的函数接口,此时是得到的数据是正确的;但将dll工程属性换成lib,将函数接口的__declspec(dllimport)前缀去掉,在加载的动态库中再去调用得到的数据就为空了。请教问题所在。此函数很简单,如下:
context* Context()
{
return ContextPtr;
}
ContextPtr是一个static变量,在被加载的动态库调用之前已经被set了。
context* Context()
{
return ContextPtr;
}
ContextPtr是一个static变量,在被加载的动态库调用之前已经被set了。
可以定义不同名称的函数指针来对应不同DLL的DllRegister()<<,,然后调用的时候就可以区分
#ifdef OS_WINDOWS
#if defined OSRES_EXPORTS
#define OSLIB_DLL_LINK _declspec(dllexport)
#else
#define OSLIB_DLL_LINK _declspec(dllimport)
#endif
#ifdef OSLIB_STATIC_LINK
#define OSLIB_DLL
#else
#define OSLIB_DLL OSLIB_DLL_LINK
#endif
#else
#define OSLIB_DLL
#endif
OSLIB_DLL void *safe_malloc (INT32 size); /*申请空间并自动清空*/
这里OSLIB_DLL表示这个函数在dll文件中的接口被输出给其它模块用。
如果不想采用这种方式,可以在def文件中增加各个需要输出的函数名字。所有输出的函数接口链接关系在生成的lib文件中,而执行代码在dll文件中(这两个文件应该在你的debug或release目录中,提供给其它项目用的h文件,需要自己整理好)。使用是,你在使用这个dll的项目中包含lib文件即可,运行时把dll放在运行目录或者windows系统目录即可。为了兼容c和c++,建议对函数名字加上C的定义:
#ifdef __cplusplus
extern "C"
{
#endifOSLIB_DLL void *safe_malloc (INT32 size); /*申请空间并自动清空*/#ifdef __cplusplus
}
#endif
如果用静态库,在编译之前定义OSLIB_STATIC_LINK即可,生成动态库时,定义OSRES_EXPORTS,用动态库时,去掉前面两个定义