Как я могу сделать портативный исполняемый файл? - PullRequest
10 голосов
/ 03 ноября 2010

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

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

Ответы [ 12 ]

22 голосов
/ 03 ноября 2010

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

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

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

13 голосов
/ 03 ноября 2010

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

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

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

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

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

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

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

Короткий ответ - ты не можешь. Более длинный ответ - написать на переносном (стандартном) C / C ++ и скомпилировать на нужных вам платформах.

1 голос
/ 12 июня 2011

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

1 голос
/ 03 ноября 2010

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

0 голосов
/ 23 декабря 2013

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

      [ Library ]

     [ mid-library]

[linux part] [windows part]

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

0 голосов
/ 22 декабря 2013

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

И ответ: «Да, есть».

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

0 голосов
/ 03 ноября 2010

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

  1. Бинарный жир. Недостатком является то, что для этого требуется поддержка ОС. Единственная известная мне пользовательская ОС, которая поддерживает эту ОС, - это OS X для перехода с мощного ПК на Intel.
  2. На лету перекрестный перевод. Как используется Transmeta и Apple. Опять нет ни одного известного поставщика решений, о котором я знаю.
  3. интерпретатор C \ C ++. Есть по крайней мере один, которого я знаю о Ch. Он работает на Windows, Linux, OS X. Примечание. Ch не полностью совместим с C ++.
0 голосов
/ 03 ноября 2010

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

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

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

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

0 голосов
/ 03 ноября 2010

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

...