переносимый двоичный исполняемый файл - PullRequest
6 голосов
/ 04 ноября 2010

После компиляции C-программы я могу взять двоичный исполняемый файл и запустить его в другой системе, где не загружен gcc, например в Ubuntu?

Ответы [ 5 ]

9 голосов
/ 05 ноября 2010

Технически: да, но используйте статическую ссылку, если вам нужна максимальная переносимость


Строго говоря, вам не нужен gcc, но вам могут понадобиться различные библиотеки. По умолчанию языковые процессоры создают динамически связанные двоичные файлы , которые требуют обширной поддержки во время выполнения в виде библиотек, и в целевой системе должны быть найдены совместимые версии, которые можно заменить теми, с которыми вы связались в хост разработки.

Для этого необходимо, чтобы целью была аналогичная версия той же ОС, например, linux to linux. Есть более тонкие проблемы с перекосом версий. В Windows это называется DLL-ад .

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

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

gcc компилирует C в машинный код, это означает, что он будет работать только на той архитектуре, для которой он был скомпилирован.Кроме того, как правило, существуют некоторые зависимости от других двоичных файлов (например, C-runtime, posix, Win32), поэтому, если вы скомпилируете программу в Ubuntu, она будет работать в Ubuntu, даже если у нее не установлен gcc, но она не будет работать в Windows или другихUnixes (например, Solaris или HPUX).

Это то, где C отличается от Java и C #, где код компилируется в код виртуальной машины и выполняется в любой системе, имеющей этот язык исполнения (JVM / CLR).Другими переносимыми языками являются языки сценариев (Perl / Python / JavaScript), где сценарий может выполняться везде, где есть интерпретатор.

3 голосов
/ 04 ноября 2010

Пока это та же архитектура и имеет те же библиотеки времени выполнения, он должен работать нормально. Например, компиляция программы в 32-битном Linux не будет работать в 64-битной Windows, но если вы скомпилируете программу в Ubuntu, а затем поместите ее на другой компьютер с Ubuntu, она должна нормально работать.

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

Частично верно.Да, вам не нужен сам компилятор, но вам нужна библиотека времени выполнения C.В любом случае, и компилятор C, и среда выполнения C являются частью POSIX, поэтому вы не найдете систему Unix без них.

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

Зависит от платформ и библиотек, установленных на платформе. Скомпилированный исполняемый файл, вероятно, будет иметь динамически связанные библиотечные зависимости, скажем, от libc и от того, с чем он был связан во время компиляции.

Какие платформы / компиляторы задействованы и куда вы хотите переместить этот двоичный файл?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...