это двоичный исполняемый файл переносимый

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

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

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


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

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

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

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

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

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

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

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