问题描述:
有一个公共的头文件里面有这么一段描述
#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就能被正确地解析成导入函数了