Dll嵌套调用

来源:互联网 发布:快3遗漏数据分析 编辑:程序博客网 时间:2024/05/29 05:54

问题描述:

有一个公共的头文件里面有这么一段描述

 

#define DLL_IMPORT __declspec(dllimport)
#define DLL_EXPORT __declspec(dllexport)


#ifdef WIN32
#ifndef DLL_EXPORT_API
#define DLL_EXPORT DLL_IMPORT
#else
#define DLL_EXPORT DLL_EXPORT
#endif
#else
#define DLL_EXPORT
#endif

#define DLL_STD_FUN extern "C" DLL_EXPORT

 

然后有一个DLL工程 如test

在工程的属性中预定义了 DLL_ERPORT_API

在test.h文件中定义一个函数(包含公共的头文件)

DLL_STD_FUN void function();

test.cpp

void function()

{...}

 

编译生成test.dll、test.lib

 

新建一个DLL工程test2

在test2.h头文件中包含:公共头文件

在工程的属性中预定义了 DLL_ERPORT_API

//test2.h:

DLL_EPPROT_API void function2();

//test2.cpp

#param(lib,"test1.lib");

void function2()

{

  function();

}

编译生成test2.dll、test2.lib

然后在另一个工程中调用test2.dll中的函数function2时,函数里的function执行失败

 

检查后发现是共用一个宏的原因(DLL_EPORT_API)

在test2中 functiona()被解析成导出函数了

#ifdef WIN32
#ifndef DLL_EXPORT_API
#define DLL_EXPORT DLL_IMPORT
#else
#define DLL_EXPORT DLL_EXPORT
#endif
#else
#define DLL_EXPORT
#endif

#define DLL_STD_FUN extern "C" DLL_EXPORT

因为在test2的工程中设置了预定义DLL_EXPORT_API

 

解决方法:

在test2工程中去掉预定义DLL_EXPORT_DLL

test2.h文件不变,在test2.cpp文件中加入

#ifndef DLL_EXPORT_DLL

#define DLL_EXPORT_DLL

#endif

这样调用test2.dll的函数function2时,test.dll的function就能被正确地解析成导入函数了