Как сделать переносимый исполняемый файл?

Есть ли способ скомпилировать исходный файл c/С++ для вывода файла .exe, который можно запускать на других процессорах на разных компьютерах? Я спрашиваю об этом для платформы Windows. Я знаю, что это можно сделать с помощью java или С#, но он использует виртуальную машину.

PS: Для тех, кто сказал, что это можно сделать только с виртуальными машинами или исходная треска должна быть скомпилирована на каждой машине, я спрашиваю, все ли вирусы написаны в java или С#, и вам нужна машина vm, которая будет заражена или вам нужно скомпилировать исходную треску червя на компьютере для заражения? (я не пытаюсь сделать вирус, но это хороший пример:))

Ответ 1

Различные компьютеры используют разные наборы команд, системные вызовы ОС и т.д., поэтому машинный код является специфичным для платформы. Вот почему были разработаны различные технологии, такие как байт-код, виртуальные машины и т.д., Позволяющие переносить исполняемые файлы. Однако, как правило, C/С++ компилируется непосредственно на машинный код, специфичный для платформы.

Таким образом, Windows exe просто не будет работать на другой платформе без какого-либо слоя эмуляции.

Однако вы можете сделать свой исходный код на C/С++ переносимым. Это означает, что все, что вам нужно сделать, чтобы ваше приложение запускалось на другой платформе, - это скомпилировать его для этой платформы.

Ответ 2

Да, вы можете, но это не обязательно хорошая идея.

Apple представила идею fat binary, когда они переходили с Motorola 68000 на чипы PowerPC еще в начале 90-х (I ' я не сказал, что они это изобрели, это самое раннее воплощение, о котором я знаю). Эта ссылка также описывает универсальные двоичные файлы FatELF Linux, но, учитывая, как мало мы их слышим, они, похоже, не ушли.

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

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

  • это было бы ужасно большим; и
  • это почти наверняка потребует специальных загрузчиков в каждой целевой системе.

Так как gcc имеет такую ​​огромную поддержку для разных платформ и кросс-компиляции, я бы сосредоточил усилия, если бы я был достаточно сумасшедшим, чтобы попробовать: -)

Ответ 3

Короткий ответ - вы не можете. Более длинный ответ заключается в записи в переносном (стандартном) C/С++ и компиляции на необходимых платформах.

Ответ 4

Вы можете, однако, сделать это на другом языке. Если вам нужно что-то запустить на нескольких платформах, я предлагаю вам исследовать Java. Схожий язык с c/С++, и вы можете "скомпилировать" (вроде) программы для работы практически на любом компьютере.

Ответ 5

Не путайте процессорные платформы с платформами ОС. для разных платформ ОС, машинные двоичные файлы совершенно разные. даже невозможно сделать индивидуальный сборщик команд. это полная архитектура набора команд может отличаться, а разные группы команд могут иметь совершенно другой формат инструкции, и даже некоторые инструкции могут отсутствовать или целевая платформа. Только эмулятор или виртуальная машина могут это сделать.

Ответ 6

На самом деле, некоторые операционные системы поддерживают это; его обычно называют " жирным бинарным.

В частности, Mac OS использует (используется) для поддержки PowerPC и x86 в одном двоичном формате.

Однако в MS Windows это невозможно, так как ОС не поддерживает его.

Ответ 7

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

Наиболее распространенной такой виртуальной машиной являются варианты виртуальной машины Java. Поэтому я хотел бы посмотреть на компилятор, который компилирует код C в код байта Java.

Кроме того, Windows однажды обрабатывала x86 как виртуальную машину на других (Alpha) архитектурах.

Ответ 8

Windows может запускать 32-битные исполняемые файлы в 64-битном режиме без проблем. Таким образом, ваш exe будет переносимым, если вы скомпилируете его в 32-битном режиме. Или вы должны выпустить 2 версии вашего исполняемого файла. Если вы используете Java или С# (или любой язык, скомпилированный байткодом), JIT/интерпретатор может оптимизировать ваш код для текущего режима ОС, поэтому он полностью переносится. Но на С++, поскольку он создает собственный код, я боюсь, что это невозможно сделать, за исключением использования двух версий вашего двоичного файла.

Ответ 9

Чтобы обобщить другие ответы, если вы хотите создать один исполняемый файл, который можно загружать и запускать на нескольких платформах, у вас есть в основном два варианта:

  • Создайте "жирный двоичный файл", который содержит машинный код для нескольких платформ. Обычно это не поддерживается большинством инструментов разработки и может потребовать специальных загрузчиков на целевой платформе;

  • Скомпилируйте байтовый код для JVM или для .Net. Я слышал об одном компиляторе C, который генерирует байт-код Java (не может запомнить имя из рук в руки), но никогда не использовал его, и я не знаю, каково качество реализации.

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

Ответ 10

Короткий ответ: вы не можете, длинный ответ есть несколько вариантов.

  • Жирный двоичный код. Недостатком является то, что для этого требуется поддержка ОС. Единственная пользовательская система, о которой я знаю, поддерживает OS X для их питания ПК для миграции Intel.
  • Перекрестный перевод на лету. Используется Transmeta и Apple. Опять нет общего поставщика решений, о котором я знаю.
  • интерпретатор C\С++. Есть, по крайней мере, один, я знаю о Ч. Он работает в Windows, Linux, OS X. Примечание. Ch не полностью совместим с С++.

Ответ 11

Этот вопрос нравится, когда спрашивают: "Есть ли способ путешествовать из Канады в другой город в мире?"

И ответ: "да, есть".

для компиляции исходного кода на C/С++ в исполняемый файл на платформе Windows без какой-либо виртуальной машины вы можете использовать API Legacy API или MFC (специально с использованием MFC в статической библиотеке вместо Dll). Этот исполняемый файл примерно работает на всех компьютерах с окнами, поскольку окна работают только на трех платформах (x86, x64, IA64, кроме Windows 8 и 8.1, поддерживающих ARM). Конечно, вы должны скомпилировать исходный код для кодов x86 для работы на 32 бит и x86-64, а Itaniums могут запускать ваш exe в эмуляции. Но обо всех Процессах, которые запускают окна как их ОС (например, ARMS на мобильных телефонах), вы должны скомпилировать это для Windows Phone или Windows CE.

Ответ 12

Вы можете написать среднюю библиотеку ~, например:

      [ Library ]

     [ mid-library]

[linux part] [windows part]

тогда вы можете использовать библиотеку, ваше приложение будет переносимым ~~