Запуск приложения, скомпилированного в cygwin, без установки cygwin

Скажем, у меня есть приложение, которое я скомпилировал под cygwin, и я хочу распространять это приложение без установки пользователем cygwin. Было бы достаточно, чтобы упаковать исполняемый файл и библиотеку cygwin?

Ответы

Ответ 1

Действительно ли ваше приложение действительно нуждается в Cygwin, обеспечивающем эмуляцию Posix? Если нет, вы можете скомпилировать его с помощью флага -mno-cygwin, и он вообще не будет зависеть от cygwin, но будет родным приложением Windows. Часто для создания и создания приложения требуется только настоящая оболочка (bash), но на самом деле вам не нужны функции Posix Cygwin.

Другой альтернативой является MSYS + MinGW, который является легким вилкой Cygwin. Это обеспечивает среду компиляции, которая по умолчанию создает собственные приложения Windows.

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

Ответ 2

Обычно да. Не забудьте установить Cygwin DLL в общедоступном месте (Windows\System32), эта DLL ведет себя очень плохо, когда несколько версий этого файла загружаются на один и тот же компьютер.

Ответ 3

Все изменилось. Библиотеки Cygwin теперь находятся под Малым GPL (v3), что позволяет связывать их с приложениями, которые подпадают под широкий спектр лицензий, от FOSS до проприетарных.

Что стоит на пути, так это то, что эмуляция POSIX в Cygwin немного заходит слишком далеко от перспективы родных приложений Windows.

Здесь я запускаю проект Cygnal. Cygnal означает CYGwin Native Application Library: это совместимая версия fork Cygwin, который изменяет или в некоторых случаях просто перенастраивает поведение определенных функций, чтобы соответствовать нативным соглашениям платформы Windows.

Базовая программа "Hello, World" Cygwin требует наличия двух библиотек. Время выполнения 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. Исходный корневой каталог Cygwin master отсутствует.

Тем не менее, с помощью Cygnal вы можете продолжать использовать функциональность POSIX, позволяя разрабатывать кросс-платформенные программы, у которых меньше кода, который переключается на платформе, по сравнению с поддержкой порта с использованием MinGW или Microsoft Visual 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.

Ответ 4

Вы можете попытаться скомпилировать все как статические. Это должно позволить вам запускать все без необходимости libs (так как они уже находятся в вашем двоичном файле). Но это также означает, что он может не работать на всех платформах, если cygwin понадобится другая или новая dll.