Подтвердить что ты не робот

Исполняемый файл, созданный с использованием GCC под cygwin

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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() теперь вызывает в DLL Windows, а не в ядро ​​Linux. Это еще совсем другая система.

Ответ 3

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

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

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

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

Ответ 4

ad 1) В настоящее время для cygwin доступны три разных кросс-компилятора mingw:
Старый gcc3 -mno-cygwin устарел.
Существуют новые кросс-компиляторы mingw64 для 32-разрядных (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 вы должны использовать обычные хосты и целевые троицы, как и с любым другим кросс-компилятором.

Ответ 5

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

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