Исполняемый файл, созданный с помощью GCC под Cygwin - PullRequest
14 голосов
/ 10 ноября 2010

Я использую Cygwin и у меня установлен GCC (версия 4.3.4 20090804 (выпуск) 1) как пакет Cygwin.

Когда я создавал код C с использованием GCC в оболочке Cygwin, сгенерированный исполняемый файл вывода является исполняемым файлом типа (исполняемый файл PE32 для MS Windows (консоль) Intel 80386 32-bit), и его можно выполнять / запускать только в оболочке Cygwin , а не как автономный .exe в оболочке Windows / командной строке. Если я попытаюсь запустить его автономно в командной строке Windows, появится окно с сообщением «Программа не может быть запущена, поскольку на вашем компьютере отсутствует cygwin.dll».

  1. Как можно сделать этот .exe автономным, который может быть выполнен в командной строке любой другой системы или даже в моей собственной системе?

  2. Я думал, что GCC под управлением Cygwin создаст исполняемый файл Linux (исполняемый ELF 32-разрядный LSB), но это не так. Как я могу использовать комбинацию gcc-cygwin для создания исполняемого файла Linux типа * .out?

  3. Кроме того, я не могу запустить исполняемый файл Linux, сгенерированный на комбинации Linux-gcc, для запуска под Cygwin.

Любые указатели были бы полезны.

Ответы [ 5 ]

14 голосов
/ 10 ноября 2010

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

1) При сборке с помощью cygwin автоматически включается этот cygwin1.dll. Это код, который вам нужен, чтобы он выглядел как UNIX. Есть флаги, позволяющие ему не использовать эту cygwin dll, что означает игнорирование UNIX и использование собственных вызовов Windows. флаг -mno-cygwin сделает двоичный файл родным двоичным файлом Windows, не используя эмуляцию cygwin. Как уже говорили другие, вам также нужно -mwindows, чтобы создавать настоящие приложения с графическим интерфейсом, используя cygwin gcc.

2) Чтобы скомпилировать на одной платформе для запуска на другой платформе, вам нужен так называемый кросс-компилятор. Вам также нужны библиотеки и заголовки для другой системы. Для того, что вы хотите, вам понадобится кросс-компилятор Cygwin-Linux, заголовки Linux и библиотеки. Вероятно, было бы намного проще запустить Linux на виртуальной машине, чем настроить это.

3) Помните, что Cygwin выглядит как код UNIX для UNIX source, а не для двоичных файлов Linux. После компиляции вызовы функций становятся вызовами Windows DLL. Программа cygwin по-прежнему является программой Windows (поэтому для ее запуска вам нужна DLL-библиотека в стиле Windows). Cygwin предоставляет код для функций / системных вызовов UNIX, таких как fork (), но даже метод вызова их теперь другой. Теперь fork () вызывает в Windows DLL, а не в ядре Linux. Это все еще совсем другая система.

14 голосов
/ 10 ноября 2010

Несмотря на широко распространенные слухи, Cygwin не эмулятор Linux, то есть он не производит и не запускает исполняемые файлы Linux. Для этого вам понадобится виртуальная машина или coLinux.

Вместо этого Cygwin - это уровень совместимости, целью которого является максимально возможная реализация API-интерфейсов POSIX и Linux в Windows. Это означает, что программы должны быть скомпилированы специально для Cygwin, но это также означает, что он лучше интегрирован с Windows, например это позволяет вам смешивать POSIX и Windows API в одной программе.

Это cygwin1.dll обеспечивает этот уровень совместимости. Если вы создаете неиспользуемые исполняемые файлы Cygwin с помощью ключа -mno-cygwin gcc-3 или одного из компиляторов MinGW, то, конечно, вы не можете использовать API, специфичные для POSIX / Linux, и любые такие вызовы необходимо будет заменить Windows эквиваленты.

4 голосов
/ 20 декабря 2010

ad 1) В настоящее время для cygwin доступны три различных кросс-компилятора mingw:
Старый gcc3 -mno-cygwin устарел.
Появились новые кросс-компиляторы mingw64 для 32bit ( mingw64-i686-gcc ) и целевые 64-битные окна ( mingw64-x86_64-gcc ).
Пока нет mingw-i686-gcc, соответствующего официальному компилятору cygwin gcc4.

ad 2) Кросс-компилятор linux отсутствует, так как пакет cygwin еще не доступен.Но люди сообщают об успешном создании такого кросс-компилятора самостоятельно.

ad 3) Кросс-компилятора cygwin в виде пакета linux не существует, но есть много кросс-компиляторов mingw.Эти исполняемые файлы mingw также можно запускать в cygwin, хотя они не могут использовать функции cygwin, только простую среду выполнения Windows.

Исправление ошибок в постах других людей:
-mswindows недопустимо, -mwindows сообщаеткомпоновщик для создания приложения с графическим интерфейсом без консоли.
-mno-cygwin действителен только для старого устаревшего компилятора gcc3 и больше не поддерживается.Не используйте это.В cygwin вы должны использовать обычные тройки хоста и цели, как и любой другой кросс-компилятор.

4 голосов
/ 10 ноября 2010

Не полный ответ, но я думаю, что могу дать некоторые указания.

1) http://www.cygwin.com/cygwin-ug-net/programming.html говорит, что вы должны использовать параметр -mswindows. Взгляните на MinGW .

2) Для этого вам нужен кросс-ключ. По умолчанию cygwin gcc создает двоичные файлы, связанные с cygwin.dll.

3) Это потому, что это бинарный файл linux. Самый простой способ - перекомпилировать программное обеспечение в cygwin.

2 голосов
/ 10 ноября 2010

Вам нужно иметь cygwin.dll на вашем пути.

Или просто использовать MinGW для компиляции собственного кода Windows без зависимостей.

...