Скажем, у меня есть приложение, которое я скомпилировал под cygwin, и я хочу распространять это приложение без необходимости установки cygwin пользователем. Достаточно ли упаковать исполняемый файл и библиотеку cygwin?
Запуск приложения, скомпилированного в cygwin, без установленного cygwin
- Библиотека cygwin под лицензией GPL, поэтому вам также придется распространять исходный код вашего приложения. 30.12.2009
- Но вы можете купить коммерческую лицензию на Cygwin. 30.12.2009
- Пожалуйста, уточните - потому что, похоже, в ответах есть два типа интерпретации. Вы имеете в виду это технически (какие другие файлы мне нужно распространять) или юридически (что позволяет мне делать лицензия)? 06.01.2010
Ответы:
Времена изменились. Библиотеки Cygwin теперь находятся под лицензией Lesser GPL (v3), что позволяет объединять их с приложениями, подпадающими под широкий диапазон лицензий, от FOSS до проприетарных.
Мешает то, что эмуляция POSIX в Cygwin заходит слишком далеко с точки зрения собственных приложений Windows.
Именно здесь вступает в силу мой проект Cygnal. Cygnal - это аббревиатура от CYGwin Native Application Library: это вспомогательная совместимый форк Cygwin, который изменяет, а в некоторых случаях просто перенастраивает поведение определенных функций в соответствии с собственными соглашениями платформы Windows.
Базовая программа Cygwin "Hello, World" требует двух библиотек. Среда выполнения GCC под названием cyggcc_s-1.dll
и Cygwin DLL cygwin1.dll
. Проект Cygnal предоставляет замену последнему. (Для загрузки доступна 32-битная сборка).
Одна вопиющая область несовместимости между представлением мира Cygwin POSIX и Windows - это обработка путей. Cygwin представляет файловую систему через поддельный корневой каталог /
и его собственную внутреннюю «таблицу монтирования», которая предоставляет такие места, как /cygdrive
, /proc
и /dev
. Cygnal покончил со всем этим. Пути - это пути Win32. Текущий рабочий каталог ведет себя так же, как текущий рабочий каталог Windows. Диски связаны с текущими каталогами, а относительные пути дисков, такие как D:foo.txt
, работают в Cygnal. В Cygnal по-прежнему доступны /dev
и /proc
: к ним обращаются как к специальным префиксам dev:/
и proc:/
. Не разрешается chdir
в них: это не было бы родным! В Cygnal, если вы с chdir
по D:\wherever
, то ваш текущий диск - это D
диск, а пути /foo
или \foo
относятся к D:\foo
. Главный корневой каталог POSIX Cygwin отсутствует.
Тем не менее, с Cygnal вы можете продолжать использовать функциональность POSIX, что позволяет разрабатывать кроссплатформенные программы, которые имеют меньше кода, переключаемого в зависимости от платформы, по сравнению с поддержкой порта с использованием MinGW или Microsoft Visual C / C ++.
Например: вы можете написать консольное приложение Win32, используя коды VT100 и termios
. Тот же код будет работать в Unix. Нет необходимости использовать консольный API Win32 в Windows и VT100 / termios
в системе POSIX.
Другой пример: для многопоточности вы можете просто использовать потоки POSIX. pthread_create
, чтобы запустить поток, pthread_mutex_lock
, чтобы заблокировать мьютекс и так далее. Вашей программе не нужна абстракция переносимости для потоков, которая переводится в Win32 или POSIX; вы просто используете POSIX и все.
Функция uname
в Cygnal сообщает sysname
с префиксом CYGNAL
, а не CYGWIN
. Благодаря этому ваша программа может сказать, что она работает на Cygnal, а не Cygwin (или любой другой платформе POSIX). Таким образом, вы можете внести любые необходимые изменения: например, если вашей программе требуется /dev/null
, на Cygnal она может вместо этого искать dev:/null
.
Действительно ли вашему приложению нужна эмуляция Posix, предоставляемая Cygwin? Если нет, вы можете скомпилировать его с флагом -mno-cygwin, и он вообще не будет зависеть от cygwin, но будет собственным приложением Windows. Часто для настройки и сборки приложения вам нужна только настоящая оболочка (bash), но на самом деле вам не нужны функции Posix Cygwin.
Другой альтернативой является MSYS + MinGW, который представляет собой легкий форк Cygwin. Это обеспечивает среду компиляции, которая по умолчанию создает собственные приложения для Windows.
Третий вариант - использовать компиляторы MinGW из самого Cygwin. Они должны быть доступны через обычный менеджер пакетов Cygwin. Затем вы должны настроить проект для кросс-компиляции с использованием компиляторов MinGW.
Обычно да. Не забудьте установить Cygwin DLL в общедоступном месте (Windows \ System32), эта DLL ведет себя очень плохо, когда несколько ее версий загружаются на один и тот же компьютер.
Вы можете попробовать скомпилировать все как статичное. Это должно позволить вам запускать все без использования библиотек (поскольку они уже находятся в вашем двоичном файле). Но это также будет означать, что он может работать не на всех платформах, если cygwin потребуется другая или более новая dll.