отсутствует zlib.dll - PullRequest
       24

отсутствует zlib.dll

0 голосов
/ 16 февраля 2011

Я создаю исполняемый файл win32.Компилятор является последней версией MinGW.Зависимости библиотеки - GLUT и libpng.

Сначала я проверил на компьютере с Windows 7, и мне нужно было получить libpng3.dll и freeglut32.dll.Однако на XP мне пришлось (вдобавок) приобрести zlib1.dll.

Машина XP была виртуальной машиной с новой установкой, поэтому я подозреваю, что в новой машине win7 также может отсутствовать zlib1.

Мой вопрос: как мне узнать, какие DLL мне нужно распространять?Как мне узнать, a priori , какие динамические библиотеки необходимы для запуска моей программы в конкретной системе?Я предполагаю, что это то, для чего предназначены программы установщика ... Я предполагаю, что установщик просматривает систему, чтобы выяснить, какие зависимости являются неудовлетворенными, и затем предоставляет их.Таким образом, если бы я распространял свою программу, я мог бы проверить, есть ли на компьютере пользователя zlib1.dll, и я не буду устанавливать zlib1.dll, если он уже найден в системном каталоге.Однако я так и не нашел документ, в котором было бы конкретно сказано «libpng требует zlib», и поэтому до того момента, как я протестировал исполняемый файл на машине без zlib, я не знал об этой зависимости.Как я могу создать свой список зависимостей, не имея новой установки каждой версии каждой операционной системы для тестирования?

Одна из моих идей - декомпилировать исполняемый файл или с помощью какого-либо метода проверить процесс компоновки, чтобы найтивсе библиотеки, которые связаны во время выполнения.Теперь проблема состоит в том, чтобы выяснить, какие из них уже должны быть, а какие из них я мог бы предоставить в дистрибутиве.

edit: Хорошо, я посмотрел иустановка libpng, которую я скачал, предоставляла zlib1.dll в каталоге bin.Так что не считая это, в значительной степени моя вина.В любом случае, ответ Даниэля окончательный.

Ответы [ 2 ]

1 голос
/ 16 февраля 2011

Dependendy Walker показывает все глубины вашей программы.

0 голосов
/ 16 февраля 2011

Правильный ответ на этот вопрос, на мой взгляд, заключается в том, чтобы начать с источника, а не перепроектировать решение с помощью Dependency Walker, удивительного и полезного инструмента, хотя, несомненно, так и есть.

Проблема с Dependency Walker заключается в том, что он говорит только о том, что требуется для одного конкретного запуска программы в той ОС, в которой вы его запускаете. Если у вас есть какие-либо динамические зависимости загрузки в вашем приложении, вы бы их выбрали, только если бы убедились, что вы профилировали приложение с помощью Dep. Уокер и заставил его пройти через эти динамические нагрузки.

Мой предпочтительный подход к этой проблеме - начать с собственного исходного кода, проанализировать и понять, от чего он зависит. Это часто достаточно легко сделать, потому что вы это хорошо знаете.

Вам необходимо понять, каковы требования к развертыванию для вашего компилятора. Обычно у вас есть варианты статической и динамической ссылки на среду выполнения C ++. Очевидно, что динамическое соединение приводит к требованию развертывания.

Вы также, вероятно, будете ссылаться на сторонний код. Одним из примеров могут быть компоненты Windows. Обычно они не нуждаются в развертывании, вы можете принять их как уже существующие. Иногда это не так, например GDI + в Windows 2000.

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

...