1

さまざまな種類のデータを取り込み、それらの値を格納するために必要な最小ビット数を使用してそれらをバッファーにパックする BitPacker オブジェクトをコーディングしました。これを再利用できるように DLL にする別のソリューションを作成しました。別のソリューションからリンクして使用することに成功しました。ただし、int の代わりに「データ」に long long を渡そうとすると、DLL 内のこれら 2 つの関数プロトタイプがあいまいになるという問題に遭遇しました。

static __declspec(dllexport) unsigned long long UnpackBits(char *srcBuffer, long long data, unsigned int &offsetBits, const unsigned int numBits);
static __declspec(dllexport) unsigned int       UnpackBits(char *srcBuffer, int data, unsigned int &offsetBits, const unsigned int numBits);
static __declspec(dllexport) float              UnpackBits(char *srcBuffer, float data, unsigned int &offsetBits);

単純に int を渡す場合は問題ありません。あいまいさを解消して両方のデータ型をサポートする方法が思いつかないので、ヘッダー ファイルとソース ファイルから "long long" バージョンをコメント アウトして DLL ソースを変更し、それらを再コンパイルすることにしました (デバッグとリリースの両方)。 . ただし、それを行った後、そのDLLへのほぼすべての呼び出しに対してリンカエラーが発生しています。long long データ メンバーを使用していた場所のインスタンスを int に変更して、コメント アウトした古い long long バージョンへの参照がないことを確認したため、理由はわかりません。

1>ChessGame.obj : error LNK2019: unresolved external symbol "public: static unsigned int __cdecl BitPacker::UnpackBits(char *,int,unsigned int &,unsigned int)" (?UnpackBits@BitPacker@@SAIPADHAAII@Z) referenced in function "public: class ChessGame * __thiscall ChessGame::LoadGame(char const *)" (?LoadGame@ChessGame@@QAEPAV1@PBD@Z)
1>Date.obj : error LNK2001: unresolved external symbol "public: static unsigned int __cdecl BitPacker::UnpackBits(char *,int,unsigned int &,unsigned int)" (?UnpackBits@BitPacker@@SAIPADHAAII@Z)
1>Turn.obj : error LNK2001: unresolved external symbol "public: static unsigned int __cdecl BitPacker::UnpackBits(char *,int,unsigned int &,unsigned int)" (?UnpackBits@BitPacker@@SAIPADHAAII@Z)
1>ChessGame.obj : error LNK2019: unresolved external symbol "public: static int __cdecl BitPacker::ReadFile(char const *,char *,int)" (?ReadFile@BitPacker@@SAHPBDPADH@Z) referenced in function "public: class ChessGame * __thiscall ChessGame::LoadGame(char const *)" (?LoadGame@ChessGame@@QAEPAV1@PBD@Z)
1>ChessGame.obj : error LNK2019: unresolved external symbol "public: static int __cdecl BitPacker::FileSize(char const *)" (?FileSize@BitPacker@@SAHPBD@Z) referenced in function "public: class ChessGame * __thiscall ChessGame::LoadGame(char const *)" (?LoadGame@ChessGame@@QAEPAV1@PBD@Z)
1>ChessGame.obj : error LNK2019: unresolved external symbol "public: static void __cdecl BitPacker::PackBits(char *,int,unsigned int &,unsigned int)" (?PackBits@BitPacker@@SAXPADHAAII@Z) referenced in function "public: int __thiscall ChessGame::SaveGame(char const *)" (?SaveGame@ChessGame@@QAEHPBD@Z)
1>Date.obj : error LNK2001: unresolved external symbol "public: static void __cdecl BitPacker::PackBits(char *,int,unsigned int &,unsigned int)" (?PackBits@BitPacker@@SAXPADHAAII@Z)
1>Turn.obj : error LNK2001: unresolved external symbol "public: static void __cdecl BitPacker::PackBits(char *,int,unsigned int &,unsigned int)" (?PackBits@BitPacker@@SAXPADHAAII@Z)
1>ChessGame.obj : error LNK2019: unresolved external symbol "public: static int __cdecl BitPacker::CopyBits(char *,char *,unsigned int &,unsigned int &,unsigned int)" (?CopyBits@BitPacker@@SAHPAD0AAI1I@Z) referenced in function "public: int __thiscall ChessGame::SaveGame(char const *)" (?SaveGame@ChessGame@@QAEHPBD@Z)
1>Turn.obj : error LNK2001: unresolved external symbol "public: static int __cdecl BitPacker::CopyBits(char *,char *,unsigned int &,unsigned int &,unsigned int)" (?CopyBits@BitPacker@@SAHPAD0AAI1I@Z)
1>ChessGameManager.obj : error LNK2019: unresolved external symbol "public: static bool __cdecl BitPacker::FileExists(char const *)" (?FileExists@BitPacker@@SA_NPBD@Z) referenced in function "public: void __thiscall ChessGameManager::RenderGameMenuIcons(void)" (?RenderGameMenuIcons@ChessGameManager@@QAEXXZ)
1>C:\Users\rvandyke\Documents\Visual Studio 2010\Projects\SuperChessW32_v003\Debug\SuperChessW32_v003.exe : fatal error LNK1120: 6 unresolved externals

呼び出し元のプロジェクトをクリーンアップして、すべてのオブジェクト ファイルを手動で削除し、[すべて再構築] を実行しようとしましたが、エラーは残ります。どういうわけか古いバージョンの DLL ヘッダー ファイルや lib をまだ使用していると思いますが、その方法や理由はわかりません。新しいDLLを「再認識」するために、呼び出し元のソリューションで何かする必要がありますか?

PS - そして、あいまいさの問題について誰かにアドバイスを求めていますか? 32 ビットと 64 ビットの両方のデータ型をサポートできるようにしたいのですが、方法がわかりません。単純に int バージョンを削除して long long バージョンだけにすることを考えましたが、戻り値の型を int に戻すときにデータが切り捨てられる可能性が心配です。

4

0 に答える 0