Существует ли руководство по распространению нативных библиотек C для Windows? - PullRequest
5 голосов
/ 19 сентября 2009

Кто-нибудь знает руководство по передовым методам развертывания собственных (без COM, без .NET) общих библиотек Windows ANSI C?

Наш продукт использует zlib, и мы распространяем готовые двоичные файлы на нашей странице загрузок, которые отличаются от официальных страниц zlib. Я предполагаю, что причина этого в , чтобы избежать смешивания времени выполнения C . Официальные из них построены против msvcrt с использованием VC ++ 6.0, а VS.NET/2005/2008 будет использовать msvcrt71 / 80/90.

Я хочу создать решения и проекты VS2005 / 8, которые будут правильно собирать zlib для нас и распространять их вместо того, что мы имеем сейчас. Я хотел бы сделать это осторожно и распространить по-настоящему полезный пакет, который я мог бы затем отправить кураторам zlib для включения в их исходный дистрибутив. Однако поиск надежной информации оказался проблематичным. У меня есть куча книг по программированию на Win32, и я нашел много статей в Интернете, но ни одна из них, кажется, не делает тщательной работы по описанию того, что вам действительно нужно распространять.

Например, zlib распространяет файлы-заглушки .exp, .lib и .def, где fftw распространяет файлы .def, но не заглушки .lib и файлы .exp. Я думаю, я мог бы просто выбросить туда все, что выглядит полезным (или просто отразить то, что в настоящее время имеет официальный zlib), но я хотел бы знать почему он должен быть там и в каких каталогах он принадлежит. 1013 *

Существуют ли хорошие примеры хорошо поддерживаемых дистрибутивов Windows библиотек, созданных в мире Unix?

Официальные двоичные дистрибутивы zlib (прокрутить вниз)

Наши дистрибутивы окон

УТОЧНИТЬ:

Мы распространяем библиотеку и предоставляем zlib (в основном) пользователям Windows, поскольку они обычно не имеют ее в наличии. Я хочу, чтобы наша сборка zlib была полезной как компонент в целом, а не только как .dll, которую потребляет наш продукт. Мы с открытым исходным кодом и широко используем, поэтому мы хотим, чтобы вся наша среда сборки была доступна и легко адаптировалась к любому компилятору, который вы хотели бы использовать.

Ответы [ 3 ]

2 голосов
/ 19 сентября 2009

Как вы знаете, смешивание времени выполнения C является реальной проблемой. Таким образом, одним из аспектов распределения DLL всегда будет выбор времени выполнения. Иногда это не свободный выбор. DLL, которая будет загружена во время выполнения существующим приложением (думаю, плагином), должна (обычно) соответствовать выбору CRT, используемому хост-приложением.

Вы можете себе представить, что можете статически связать ЭЛТ с вашей DLL и избежать проблем. Проблема, которая возникает тогда, заключается в том, что вам приходится передавать выделенные указатели между DLL и ее хост-приложением, поскольку большая часть проблем со смешанными средами выполнения связана с наличием более одной реализации malloc() и free() в процессе. Однако с помощью тщательно разработанного и реализованного API для DLL это может быть решением.

В таких дистрибутивах, как Lua Binaries , описанных Ответ Марка Рушакова , используется большое количество средств автоматизации сборки, позволяющих сделать так много комбинаций платформы и компилятора. Поддержание процесса сборки - это значительный объем работы для его команды. Когда отдельная группа решила создать установщик Windows для Lua , чтобы предоставить пользователям Windows возможность простого первого использования, они решили (я считаю разумно) выбрать одну версию CRT для своего продукта и потребовать, чтобы все DLL-библиотеки расширений, которые поставляются с ним, скомпилированы для этой единственной версии.

Одной из практик, которой вы должны следовать как часть своей версии пакета, является использование Dependency Walker для проверки того, что используется ожидаемый CRT, и что все другие зависимости являются либо системной DLL, из приложения вашего хостинга установка, или также включена в ваш пакет. Обходчик зависимостей может быть запущен из пакетного файла, поэтому его можно использовать как часть набора регрессионных тестов для автоматической проверки. Например, при выпуске проектов, основанных на Lua, я запускаю свою окончательную сборку в Dependency Walker из Makefile как часть цели, которая создает установочный пакет, и использую сценарий perl для проверки журнала, чтобы убедиться, что единственные используемые DLL являются либо частями моей установки или из системы.

Как уже говорили другие, если ваша DLL используется конечными пользователями, которые не ожидают разработки с ней (например, плагином для более крупного приложения, распространяемого независимо), тогда все, что вам нужно для упаковки, - это сама DLL (и любые его зависимости, документация для конечного пользователя и т. д.). В этом случае вы просто должны убедиться, что DLL использует ту же среду выполнения, что и приложение.

Если DLL предназначена для сообщества разработчиков, то вы, скорее всего, в случае с множественными сборками Lua Binaries. Каждый дистрибутивный пакет будет содержать правильно построенную DLL, а также библиотеку импорта (.LIB) и всю документацию. Для библиотек DLL, созданных VS, которые, как ожидается, будут связаны с кодом из других компиляторов, может быть целесообразно включить файл .DEF, который документирует фактические экспортированные имена. Современному MinGW это на самом деле не нужно, но пользователи Borland C или, возможно, языков, отличных от C, могут использовать любую помощь, которую они могут получить.

Учитывая недавний рост популярности динамических языков, таких как Lua, Perl, TCL и Python, которые часто можно легко привязать к библиотекам, реализованным в C, эти пользовательские сообщества также могут получить высокую оценку, если вы можете предоставить привязки для эти языки вместе с двоичными файлами, скомпилированными по «локальному обычаю» для выбора CRT.

1 голос
/ 19 сентября 2009

В качестве ориентира я хотел бы привести LuaBinaries . Короткая предыстория состоит в том, что, поскольку Lua достаточно настраиваем, они думали, что было бы хорошо иметь «стандартный» дистрибутив, чтобы любой мог, например, распространять скомпилированные с помощью байт-кода сценарии Lua, а любой, использующий «стандартные» двоичные файлы Lua, мог бы возможность запустить их с эквивалентными результатами.

В разделе Windows вы увидите, что загружаемые файлы соответствуют форме Lua_5_1_4_Win32_{PLAT}{VER}_lib.zip. {PLAT} может быть Cygwin, VC [6-9], MinGW или просто DLL, среди прочих.

Если бы вы взяли, например, lua5_1_4_Win32_vc9_lib.zip, вы нашли бы просто файл lua5.1.lib (плюс заголовки), потому что это статическая библиотека (и эта была скомпилирована в VS2008).

lua5_1_4_Win32_dll9_lib.zip содержит lua5.1.lib и lua5.1.dll - вы можете ссылаться на этот .lib во время компиляции, и это действительно все, что вам нужно.

Если ваша единственная цель - Visual Studio, то .lib, генерируемый при компиляции в DLL, должен быть единственным файлом, который вам нужен, кроме DLL и заголовков - если вы не хотите, чтобы ваши пользователи просто вызывали LoadLibrary и GetProcAddress для доступа ко всем функциональности вашей DLL.

Насколько я могу судить, единственная потребность в файле .def - это взаимодействие DLL между MinGW и VS . Насколько я понимаю, давным-давно VS использовал файлы .def в дополнение к .libs, но теперь вся необходимая информация VS содержится только в .lib. Вы можете конвертировать между файлами .lib и .def (если вы не можете скомпилировать код для одного или другого), но это немного хлопотно - вам придется использовать pexports для генерации файла .def, например.

Надеюсь, LuaBinaries - хороший справочник о том, как поддерживать множество компиляторов Win32. Но я действительно не уверен, нужно ли делать заглушку .lib для каждой версии VS, потому что я почти уверен, что без проблем отправил VS. 2003 .lib и .dll кому-то, кто использует VS2008.

0 голосов
/ 19 сентября 2009

Если ваша цель - конечные пользователи (т. Е. Вам просто нужно запустить приложение), вам нужно только распространить dll.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...