1

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

    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.hSoundStuff.cpp,它们位于一个单独的项目中,也以与上述类似的方式转换为 dll。所属项目对SoundStuff所属项目具有项目依赖关系Memory。在 SoundStuff.cpp 的实现中FUN_DELETE,来自Memory.h的 被调用。它是通过单独项目中的函数调用的,但无论如何都会调用它。这会导致链接器错误。

错误 LNK2019:未解析的外部符号“void __cdecl operator delete(void *,char const *,int)”(??3@YAXPAXPBDH@Z) 在函数 __unwindfunclet$?Init@SoundStuff@@AAEXXZ$1 SoundStuff.obj 中引用

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

4

1 回答 1

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. 这将确保__declspec( dllexport )在构建 CoreFunctions DLL(因此它们被导出)和__declspec( dllimport )DoSomeStuff 正在构建(因此它们被导入)时声明您的函数/类。

于 2009-10-14T16:13:50.483 回答