Недавно я установил Visual Studio 2010 и использовал CMake для создания файлов решений для моего проекта. Этот процесс ранее работал отлично на VS2005.
Первая проблема, с которой я столкнулась, связана с новыми "конструкторами перемещения", поэтому мне пришлось удалить некоторые неявные преобразования из моего кода — справедливо, что работает сейчас.
Моя текущая ситуация выглядит следующим образом: Я компилирую DLL 1, которая зависит только от некоторых системных библиотек (Kernel32 и т.д.) и CRT, а DLL 2, который ссылается на DLL 1, а также на некоторые сторонние библиотеки.
Ошибки, которые я получаю, соответствуют строкам:
DLL1.lib(DLL1.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)" ([email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]) already defined in objFromDLL2.obj
Это, по-видимому, проблема, описанная здесь здесь.
Однако ничто в этой теме не решает мою проблему.
- Я подтвердил, что как DLL1, так и DLL2 скомпилированы с флагом генерации кода MD,
- DLL2 ссылки на squish, glew и devil — Я вручную перекомпилировал все эти и любые библиотеки, на которые они зависят, для VC10, также с /MD
- изменить. эта статья (похожа на мою проблему), я удалил все экземпляры классов вывод из std:: container
- изменить Я подтвердил, что это не проблема третьей стороны, поскольку я скомпилировал другой проект с использованием одного и того же набора библиотек, однако я до сих пор не могу скомпилировать свой оригинальный проект
- edit dllexport используется во всех необходимых местах в моем коде
Что мне не хватает? Пожалуйста, дайте мне знать, если мне нужно предоставить дополнительную информацию, и я отредактирую вопрос как можно лучше.
update: Это было какое-то время, и у меня все еще нет решения. Я обновляю вопрос с ответами на комментарии, и сейчас я работаю над другой базой кода, которая действительно работает. Я начинаю думать, что обратная совместимость для более старого кода, наконец, начала высыхать, и я должен просто двигайтесь дальше.
больше обновлений: я обнаружил, что, вероятно, очень нежелательный флаг компоновщика /FORCE: MULTIPLE, который превращает ошибки в предупреждения, игнорируя все, кроме первого определения символов. Это должно быть плохим побочным эффектом. Тест этого флага выделил LNK2001: неразрешенный std::string:: npos, который был похоронен во всех предыдущих ошибках LNK2005. Мучения никогда не заканчиваются.