Я написал код, который использует библиотеку с открытым исходным кодом, чтобы выполнить некоторые тяжелые операции. Эта работа была выполнена в Linux, с модульными тестами и cmake, чтобы помочь портировать их в окна. Существует требование, чтобы он работал на обеих платформах.
Мне нравится Linux, и мне нравится cmake, и мне нравится, что я могу автоматически создавать файлы визуальных студий. Как и сейчас, в Windows все будет компилироваться, и оно будет связано, и оно будет генерировать тестовые исполняемые файлы.
Однако, чтобы добраться до этого момента, мне пришлось сражаться с окнами в течение нескольких дней, изучая все файлы манифеста и распространяемые пакеты.
Насколько я понимаю:
В VS 2005, Microsoft создала сторонние библиотеки. Мотивация для этого заключается в том, что до этого несколько приложений устанавливали разные версии одной и той же DLL, что приводило к сбою ранее установленных и рабочих приложений (например, "Dll Hell" ). Скриншоты Side by Side исправят это, так как теперь к каждому исполняемому файлу /dll добавлен файл манифеста, который указывает, какая версия должна быть выполнена.
Это хорошо и хорошо. Приложения больше не должны падать таинственно. Однако...
Microsoft, похоже, выпустила новый набор системных DLL с каждой версией Visual Studios. Кроме того, как я упоминал ранее, я разработчик, пытающийся связаться с сторонней библиотекой. Часто эти вещи распространяются как "предварительно скомпилированные DLL". Теперь, что происходит, когда предварительно скомпилированная dll, скомпилированная с одной версией визуальных студий, связана с приложением с использованием другой версии визуальных студий?
Из того, что я читал в Интернете, происходит плохой материал. К счастью, я так и не зашел так далеко - я продолжал сталкиваться с проблемой "MSVCR80.dll не найден" при запуске исполняемого файла и, таким образом, начал свой набег во всю эту проблему манифеста.
Наконец, я пришел к выводу, что единственный способ заставить это работать (помимо статической привязки всего) состоит в том, что все сторонние библиотеки должны быть скомпилированы с использованием той же версии Visual Studios - т.е. не использовать предварительно скомпилированные dlls - загрузить источник, создайте новую dll и используйте это вместо этого.
Действительно ли это так? Я что-то пропустил?
Кроме того, если это так, то я не могу не думать, что Microsoft делала это специально по гнусным причинам.
Он не только разбивает все предварительно скомпилированные двоичные файлы, что излишне сложно использовать предварительно скомпилированные двоичные файлы, если вы работаете с компанией-разработчиком программного обеспечения, которая использует сторонние библиотеки, а затем всякий раз, когда они обновляются до последней версии визуальных студий - ваша компания должна теперь сделать то же самое или код больше не будет работать.
Как в стороне, как Linux избегает этого? Хотя я сказал, что предпочитаю развиваться на нем, и я понимаю механику связывания, я не поддерживал какое-либо приложение достаточно долго, чтобы справиться с такой проблемой управления версиями разделенных библиотек низкого уровня.
Наконец, подытожим: возможно ли использовать предварительно скомпилированные двоичные файлы с этой новой схемой манифеста? Если это так, в чем была моя ошибка? Если это не так, действительно ли Microsoft считает, что это облегчает разработку приложений?
Обновление - более краткий вопрос: Как Linux избегает использования файлов манифеста?