在dll项目之间使用extern方法?

时间:2009-10-14 15:58:20

标签: c++ visual-studio dll extern

我有一个调试条件来管理我所拥有的内存

    extern void* operator new(unsigned int size, const char* file, int line);
    extern void operator delete(void* address, const char* file, int line);
    extern void Delete(void* address);
    #define FUN_NEW new(__FILE__, __LINE__)
    #define FUN_DELETE delete

这存在于 Memory.h 中,并在 Memory.cpp 中实现。 Memory.h定义为:

#ifdef MEMORY_EXPORT
#define DECL_MEMORY __declspec(dllexport)
#else
#define DECL_MEMORY __declspec(dllimport)
#endif
class DECL_MEMORY Memory : public Singleton<Memory>
{

现在,我有 SoundStuff.h SoundStuff.cpp ,它们在一个单独的项目中,也以与上面类似的方式转换为dll。 SoundStuff所属的项目对Memory所属的项目具有项目依赖性。在SoundStuff.cpp的实现中,调用来自 Memory.h FUN_DELETE。它通过单独项目中的函数调用,但无论如何都会调用它。这导致链接器错误。

  

错误LNK2019:未解析的外部   符号“void __cdecl运算符   delete(void *,char const *,int)“   (?? 3 @ YAXPAXPBDH @ Z)引用于   功能   __unwindfunclet $?Init @ SoundStuff @@ AAEXXZ $ 1 SoundStuff.obj

为什么会这样,我该如何解决?

1 个答案:

答案 0 :(得分:1)

您必须明确告诉编译器您要导出哪些函数。这里有一些小小的歌舞,我就是这样做的:

#ifdef USING_DLL
#ifdef CORE_EXPORTS
#define CORE_EXPORT __declspec( dllexport )
#else
#define CORE_EXPORT __declspec( dllimport )
#endif
#else
#define CORE_EXPORT
#endif

我要导出的每个功能(或类)都标有CORE_EXPORT。要构建DLL,请定义USING_DLL,并在CoreFunctions项目中(但不是您的DoSomeStuff项目)定义CORE_EXPORTS。这将确保您的函数/类在构建CoreFunctions DLL时被声明为__declspec( dllexport )(因此它们被导出),并且在构建DoSomeStuff时将__declspec( dllimport )声明(因此它们被导入)。