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_DELETEMemory.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 のビルド時 (エクスポートされる) とDoSomeStuff のビルド時 (インポートされる) に、関数/クラスが確実に宣言__declspec( dllimport )されます。

于 2009-10-14T16:13:50.483 に答える