Как избежать связывания zlib objs с двоичным файлом в Delphi более одного раза - PullRequest
0 голосов
/ 23 октября 2011

Я искал в zlib пример того, как декодировать http-кодировку gzip / deflate, используя только модуль ZLib (Delphi 7). Я использовал Indy 10 для этого, но потом наткнулся на статью, в которой говорилось, что многие сторонние компоненты реализовали свои собственные помощники zlib, в результате чего несколько объектов zlib сошлись в выходном файле. У меня есть этот огромный проект и я ищу способы уменьшить размер. Я выполнил поиск по двоичному файлу и выяснил, что у меня есть как минимум 4 копии zlib, связанные с ним.

Есть ли способ избежать объединения файлов zlib obj в двоичный файл более одного раза? Можно ли заставить Indy вообще не использовать / импортировать zlib?

Ответы [ 2 ]

2 голосов
/ 23 октября 2011

Есть ли способ избежать привязки файлов zlib obj к двоичному более одного раза?

Нет, нет. Связывание файлов .obj является частным для каждого модуля. Вы не можете обнаружить с одного устройства, что какое-то другое устройство связало файл .obj.

1 голос
/ 23 октября 2011

Вы уверены, что это связывает двоичные идентичные копии? Что если различия имеют значение для соответствующих библиотек, связывающих zlib / zlibex? Если вы действительно хотите решить эту проблему, вам следует запаковать пакеты INdy и исполняемые файлы DCU / DCP, поставляемые с Delphi, и собрать все из исходного кода самостоятельно.

Перечислите для нас, какие именно библиотеки вы используете, которые содержат ZLib. Теперь получите полный исходный код для каждого и соберите их все самостоятельно. Сделайте так, чтобы все они зависели (во время разработки) от общего пакета, который содержит источники ZLib, чтобы источники ZLib не загружались во время разработки несколько раз. Теперь сделайте то же самое для вашей непакетной среды; Убедитесь, что существует только одна копия исходных файлов ZLib, встроите их в файлы obj с помощью компилятора C (ZLib - это пакет C), а затем скомпонуйте их и протестируйте, чтобы убедиться, что все они работают. Если вы не готовы тестировать все после изменения версий zlib, откажитесь от вашей попытки сейчас. Если вы не можете или не хотите учиться читать код на C, также оставьте свою попытку.

В Delphi 2009 Enterprise и ARchitect до XE читатели должны быть осторожны, так как это запускает эффект домино каскадных проблем, которые невозможно полностью устранить, если, например, вы полагаетесь на DataSnap, который опирается на точный ABI Indy BPl, который поставляется с Delphi. Конечно, в такой древней версии, как Delphi 7, вы можете решить все эти проблемы и перестроить их самостоятельно в Delphi 7.

Я не могу угадать для вас, какие у вас есть библиотеки, которые могут содержать дубликаты Zlib, но некоторые общие места, которые я нашел, это: Любой тип библиотеки zip / archive (TurboPower Abbrevia), сетевые библиотеки (например, Indy), и так далее. JEDI JCL содержит копию ZLib и содержит свои собственные компоненты сжатия на основе Zlib, которые, если вы их используете, будут связаны. Вы должны найти что-то в своем исходном коде. Если вы удивитесь, обнаружив 4 копии Zlib (возможно, это даже разные версии Zlib), я могу гарантировать, что вы обнаружите еще больше сюрпризов, если начнете исследовать свой код и исходный код компонента.

...