Перенос среды разработки с Visual Studio 2003 на 2010: почему я получаю ошибки LNK2005? - PullRequest
0 голосов
/ 13 февраля 2012

В настоящее время у меня есть две библиотеки DLL - CMN и GT.GT зависит от CMN.

В Visual Studio 2003 я могу без проблем компилировать и связывать обе библиотеки.Я могу успешно скомпилировать CMN и GT в Visual Studio 2010 и связать CMN.Однако, если я пытаюсь связать GT, я получаю следующие ошибки:

CMN.lib(CMN.dll) : error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ABV01@@Z) already defined in TokenizerAdvanced.obj
CMN.lib(CMN.dll) : error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::~basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(void)" (??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ) already defined in TokenizerAdvanced.obj
CMN.lib(CMN.dll) : error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(char const *)" (??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBD@Z) already defined in TokenizerAdvanced.obj
CMN.lib(CMN.dll) : error LNK2005: "public: void __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::reserve(unsigned int)" (?reserve@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXI@Z) already defined in TokenizerAdvanced.obj
CMN.lib(CMN.dll) : error LNK2005: "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::erase(unsigned int,unsigned int)" (?erase@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@II@Z) already defined in TokenizerAdvanced.obj

TokenizerAdvanced - это исходный файл в GT.

Вся компиляция и компоновка выполняются с одинаковой структурой командной строки(используя -MDd для компиляции).Что изменилось между Visual Studio 2003 и 2010, что могло бы вызвать эту проблему?

Редактировать: Как ни странно, если я исключаю TokenizerAdvanced.cpp из сборки (другой файл - Tokenizer.cpp делаетне ссылаться на него), я получаю неразрешенную внешнюю ошибку:

Tokenizer.obj : error LNK2001: unresolved external symbol "public: static unsigned int const std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::npos" (?npos@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@2IB)

Редактировать: Перенести расследование в ответ.

1 Ответ

0 голосов
/ 20 февраля 2012

Я думаю, что нашел проблему. У нас есть классы, которые происходят от строки в CMN. Смотрите здесь .

В этом обсуждении предлагается добавить следующее в исходный код клиентской библиотеки:

template std::string::size_type std::string::npos;
template std::wstring::size_type std::wstring::npos;

Но это не решило проблему для меня.

В этом обсуждении предлагается изменить любые классы, которые являются производными от строки (и я заметил, что наш код делает это в нескольких местах), чтобы вместо этого использовать сдерживание, что я и сделал. Это решило проблему.

...