Повторное связывание с измененной DLL в другом решении в Visual Studio 2010 - PullRequest
1 голос
/ 31 марта 2012

Я кодировал объект BitPacker, который принимает различные типы данных и упаковывает их в буфер, используя наименьшее количество битов, необходимых для хранения их значений. Я создал отдельное решение, чтобы превратить его в DLL для повторного использования. Мне удалось связать его с другим решением и использовать его. Однако я столкнулся с проблемой того, что эти два прототипа функций в DLL являются неоднозначными при попытке передать long long для «data» вместо int:

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. Поскольку я не могу придумать способ устранения неоднозначности для поддержки обоих типов данных, я решил изменить источник DLL, закомментировав «длинные длинные» версии из заголовочных и исходных файлов и перекомпилировав их (как для Debug, так и для Release) , Однако после этого я получаю ошибки компоновщика для почти каждого вызова этой DLL сейчас. Я не знаю, почему, поскольку я также изменил случаи использования длинного длинного члена данных на int, чтобы не было ссылки на старую длинную длинную версию, которую я закомментировал.

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

Я попытался очистить вызывающий проект, вручную удалив все объектные файлы и выполнив Rebuild All, но ошибки остались. Я думаю, что он все еще использует старую версию заголовочного файла DLL и / или lib, но не знаю, как и почему. Есть ли что-то, что мне нужно сделать в моем вызывающем решении, чтобы оно "распознало" новую DLL?

PS - А пока я спрашиваю кого-нибудь, есть ли какой-нибудь совет по проблеме неоднозначности? Я хотел бы иметь возможность поддерживать 32- и 64-битные типы данных, но не уверен, как именно. Я думал о том, чтобы просто избавиться от версии int и иметь только длинную длинную версию, но потом я беспокоюсь о возможности усечения данных при перехвате возвращаемого типа обратно в int.

...