Как устранить эту ошибку компоновщика (Unicode, Boost, TCHAR / tstring (Visual Studio 2008)) - PullRequest
1 голос
/ 16 марта 2012

Мы просто «портировали» наше приложение на Unicode, и у меня возникли трудности с некоторыми ссылками.

Интересно, может быть, я пропускаю какой-то другой флаг, потому что я не уверен, что означает искажение названия ниже:

Это ошибка ссылки, которую я получаю

Ошибка 31, ошибка LNK2019: неразрешенный внешний символ "public: class boost :: shared_ptr __thiscall ResourceManager :: GetImage (class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short>> const &, bool) " (? GetImage @ ResourceManager @@ QAE? AV? $ Shared_ptr @ VPngImage @@@ увеличить @@ ABV? $ Basic_string @ GU? $ Char_traits @ G @ станд @@ V? $ Распределитель @ G @ 2 @@ станд @@ _ N @Z) упоминается в функции "public: long __thiscall ATL :: CAxWindowT :: QueryHost (struct _GUID const &, void * *)" (? QueryHost @? $ CAxWindowT @ VCWindow @ ATL @@@ ATL @@ QAEJABU_GUID @@ PAPAX @ Z) wndGroupSearch.obj

Метод в коде. Объявлено так:

boost::shared_ptr<PngImage> GetImage(const tstring& name, bool bLocalizedOnly = false );

Когда я запускаю dumpbin в lib, который не связывается, я получаю следующее:

public: class boost::shared_ptr<class PngImage> __thiscall ResourceManager::GetImage(class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > const &,bool))
    ?GetImage@ResourceManager@@QAE?AV?$shared_ptr@VPngImage@@@boost@@ABV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@_N@Z

Когда я выкидываю версию Debug (которая правильно связывает), я получаю следующее в дампбине для lib

public: class boost::shared_ptr<class PngImage> __thiscall ResourceManager::GetImage(class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> > const &,bool)" (?GetImage@ResourceManager@@QAE?AV?$shared_ptr@VPngImage@@@boost@@ABV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@_N@Z)
?GetImage@ResourceManager@@QAE?AV?$shared_ptr@VPngImage@@@boost@@ABV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@_N@Z (public: class boost::shared_ptr<class PngImage> __thiscall ResourceManager::GetImage(class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> > const &,bool))

Есть ли какая-то проблема с бустом или, возможно, отсутствует флаг компиляции или ссылки, который мне не хватает, чтобы это исправить?

Это работает в нашей отладочной Unicode-сборке, но не в Release-сборке. Я еще не выяснил, почему искаженные имена выглядят по-разному:

? $ Basic_string @ GU? $ Char_traits против ? $ Basic_string @ _WU? $ Char_traits

и более дружелюбные имена:

ResourceManager::GetImage(class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> > const &,bool)

против

ResourceManager::GetImage(class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > const &,bool))

wchar_t и GU против неподписанного короткого _WU

Есть предложения?

1 Ответ

4 голосов
/ 16 марта 2012

Кажется, что есть некоторые ссылки на basic_string<wchar_t> и некоторые ссылки на basic_string<unsigned short>. Это может быть потому, что опция

/Zc:wchar_t Обрабатывать wchar_t как нативные типы

не установлен последовательно для всех файлов.

...