Конфликт между stl из разных версий Visual C ++ - PullRequest
2 голосов
/ 28 декабря 2010

У меня есть закрытый исполняемый файл (без источника), который был скомпилирован с VC ++ 7.1 (VS2003).Этот исполняемый файл загружает DLL, для которой у меня есть исходный код.

Я пытаюсь избежать компиляции этой DLL с помощью инструментария VS2003, потому что он включает в себя установку этого инструментария на каждую машину, на которой я хочу его скомпилировать, и использование make-файла вместо непосредственного использования нового проекта VS.

Я изменил параметры, такие как библиотека времени выполнения (я использую / MT вместо / MD для предотвращения конфликтов DLL времени выполнения) и некоторые другие языковые переключатели, чтобы поддерживать совместимость со старым компилятором.Наконец, он скомпилирован и прекрасно связан с библиотеками VS2005.

Но потом, когда я попытался запустить его, он вылетел.Причина: DLL отправляет std :: string (а в других местах - std :: vector) обратно в exe, и конфликтующие версии реализации STL вызывают что-то плохое.

Так что мой вопрос: Есть ли способ обойти это?Или я должен продолжать компилировать DLL с помощью инструментария VC7.1?

Я не очень оптимистичен, но, возможно, у кого-то будет хорошая идея по этому поводу.

Спасибо.

1 Ответ

0 голосов
/ 19 июля 2011

Когда значения библиотек stl изменяются, это нарушает совместимость binary , которая (на мой взгляд), когда изменяется размер / переменные-члены объекта. Обе стороны не согласны с тем, насколько велик размер std :: string / vector / etc.

Если старый исполняемый файл считает, что std :: string 32-битный символ * ptr и длина 32 бита size_t, а новый исполняемый файл считает, что std :: string представляет собой 64-битный итератор * iterator_list, 64-битный символ * ptr, длина 64 бита size_t, тогда они не могут передавать строки назад и вперед. Вот почему в старых форматах (windows, bmp) первый член - 32-битный size_of_object.

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

...