2010-11-03 2 views
10

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

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

+5

Same OS или нет? Вот в чем вопрос. – leppie

+0

Must .exe подразумевает COFF, или это может быть ELF или любой другой двоичный формат? Это еще один вопрос ... –

+0

Да, такая же ОС (в данном случае Windows). – Stefan

ответ

22

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

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

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

3

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

+1

Нет, более длинный ответ - вы можете, но вы, вероятно, этого не хотите. (Например, для компиляции с байтовым кодом Java.) –

+4

@Amigable Существует множество платформ, для которых нет JVM, но имеет совместимый компилятор C. –

+0

да совершенно, но это не оригинальный вопрос. –

1

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

+2

Я не вижу, как java похожа на C/C++ –

+0

@Armen Tsirunyan: Довольно просто: Java основана на C++. – Gorpik

+0

@ Gorpik: Синтаксически - может быть, но парадигма двух языков совершенно другая –

12

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

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

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

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

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

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

+11

+1 Только за возмутительное предложение написать компилятор. –

+1

яблоко все еще делает это. «Универсальные двоичные файлы» содержат как PPC, так и Intel. edit: на самом деле это не один бинарный файл, разные бинарные файлы (и метаданные, подобные значкам) содержатся в каталоге с расширением «приложение». –

+0

Можно подумать о том, чтобы использовать clang, хотя он очень недоразвитый, и может потребоваться отлучение с двоичным кодом? –

0

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

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

В MS Windows, однако, это не представляется возможным, поскольку операционная система не поддерживает его.

+0

Windows поддерживает совместимость ABI, охватывающую около 20 лет. Там не так уж много потребности в жирных двоичных файлах (хотя они все-таки толстые, и только одна платформа). Также Windows работает только с x86 и друзьями. –

+0

@Matt: Ну, согласно Википедии, Windows NT использовалась для работы на PowerPC, DEC Alpha и MIPS R4000. И в настоящее время theres x86 и x86-64, где снова могут использоваться живые двоичные файлы. – sleske

0

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

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

Кроме того, Windows когда-то обрабатывали x86 as a virtual machine на других (Alpha) архитектур.

0

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

0

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

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

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

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

0

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

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

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

0

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

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

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

-1

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

 [ Library ] 

    [ mid-library] 

[linux part] [windows part] 

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

Смежные вопросы