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