Вообще говоря, C программы не являются «переносимыми», что означает, что они не могут быть скопированы на другие машины и могут быть запущены.
Есть несколько исключительных случаев, когда C исполняемые файлы могут безопасно запускаться на других машинах:
- Процессоры поддерживают один и тот же набор команд, с таким же набором совместимых побочных эффектов и, возможно, одинаковыми ошибками.
- Операционные системы поддерживают одинаковые системные API-точки с одинаковым набором совместимых побочных эффектов и, возможно, одинаковыми ошибками.
- Установленные библиотеки не операционной системы поддерживают одинаковые API-точки с одинаковым набором совместимых побочных эффектов и, возможно, те же ошибки.
- Соглашения о вызовах API одинаковы между источником (платформой, на которой вы создали код) и местом назначения (платформой, на которой вы будете запускать исполняемый файл).
Конечно не все ЦП и ОС должны быть на 100% совместимы, только те части, которые использует ваша скомпилированная программа (что не всегда легко найти) в том виде, как он скомпилирован, а не на 100% идентичное представление исходного кода)
Для выполнения этих условий обычно используется та же версия операционной системы или интерфейс совместимости, разработанный операционной системой. системные упаковщики, которые поддерживают текущую версию операционной системы и более старые версии.
Сведения о том, как это проще всего сделать, различаются в разных операционных системах, и, вообще говоря, даже если присутствует уровень совместимости, вам нужно проводить адекватное тестирование, поскольку побочные эффекты и ошибки, как правило, различаются, несмотря на обещания совместимости с несколькими операционными системами.
Наконец, есть некоторые среды, которые могут запускать не одинаковые исполняемые файлы ЦП в операционной системе (например, QEmu), имитируя набор команд внешнего ЦП во время выполнения, объединяя эти инструкции в команды, совместимые с текущим ЦП. Такие системы не распространены среди не Linux операционных систем; и они могут споткнуться, если загрузка динамических c библиотек не может найти и загрузить библиотеки внешних наборов команд.
Со всеми этими предостережениями вы можете понять, почему большинство людей решают написать переносимый исходный код и перекомпилируйте его на каждой целевой платформе; или напишите их код для интерпретатора, который уже существует на нескольких платформах. С подходом интерпретатора, CPU концептуально является виртуальным, который реализован так, чтобы быть идентичным для всего оборудования, что позволяет вам писать один набор исходного кода для интерпретации на всех аппаратных платформах.