Запуск приложения, скомпилированного в 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.