Хорошо, давайте посмотрим на это с более общей точки зрения:
Для начала вам понадобится компьютер с совместимым процессором , которыйработает с целевой машиной вывода компилятора.Вы можете подумать, что это очевидно, но при условии, что код компилируется в машинный код x86, он не будет работать на процессоре Alpha, который использует другие инструкции.В качестве альтернативы, если вы скомпилируете в машинный код x64, он не будет работать на процессоре только для x86.Таким образом, для запуска программы на C ++ необходимо правильное оборудование, в отличие от языков на основе виртуальных машин, таких как Java, которые абстрагируются от этого.
Вам также потребуется правильная операциясистема .Я не специалист по портированию программ, но я не думаю, что возможно создать один исполняемый файл, который работает на нескольких операционных системах в C ++.Например, компиляция даже вашего второго примера для Windows будет содержать много кода библиотеки времени выполнения за кулисами до и после фактического вызова вашей функции main()
.Это будет делать такие вещи, как подготовка кучи и инициализация библиотеки CRT.CRT для Windows реализован через Windows API.Вы можете статически связать библиотеку, чтобы не требовалась библиотека CRT DLL, но код в вашей программе по-прежнему вызывает Windows API, поэтому он по-прежнему зависит от платформы.В качестве эксперимента я скомпилировал пустую программу со статическим связыванием в Windows с Visual Studio, и, согласно Dependency Walker, он по-прежнему ссылается на KERNEL32.DLL для таких функций, как HeapCreate
и ExitProcess
.Таким образом, «пустая» программа по-прежнему выполняет целую кучу вещей операционной системы для вас, готовясь сделать что-то полезное (независимо от того, делает ли ваша программа что-нибудь полезное).
Такжеобратите внимание, что вполне может быть минимальная версия операционной системы: Visual Studio 2010 требует Windows XP SP2 или выше даже для пустой программы из-за вызовов, сделанных на EncodePointer
и DecodePointer
.См. этот вопрос .
Система должна иметь память , доступную для запуска вашей программы.Вы можете подумать, что это ничего не делает, но, как показано выше, до того, как main()
вызывается, из библиотеки вашей программы выполняется полная загрузка вызовов инициализации ОС.Вероятно, для этого требуется некоторая память и время обработки, необходимое для ее выполнения.
В зависимости от конфигурации операционной системы вам может потребоваться привилегий безопасности для запускаисполняемые программы.
Короче говоря, чтобы запустить пустую программу на C ++ даже со статическим связыванием, вам нужен правильный процессор, операционная система, разрешение на запуск исполняемого файла и память / обработкавремя для завершения программы.По сравнению с технологиями виртуальных машин, такими как Java или .NET, требования могут быть сведены к правильной виртуальной машине, необходимым привилегиям и необходимому времени памяти / ЦП для запуска программы.Это может быть не так просто, как кажется: вам может потребоваться правильная версия виртуальной машины, например .NET Framework 4.0.Это может усложнить процесс распространения, поскольку обновление всей инфраструктуры JVM или .NET для компьютера может занять много времени, требуя прав администратора и, возможно, подключения к Интернету.В некоторых узких случаях это может нарушить условия сделки, поскольку в редких случаях легче сказать, что «он будет работать на любой x86-совместимой операционной системе Windows начиная с XP», а не «на любой машине с новейшей виртуальной машиной».машина, которая была выпущена только вчера ".Однако в большинстве случаев тот факт, что виртуальная машина позволяет (теоретически) забыть о процессоре, а операционная система облегчает распространение программы;в C ++ вам необходимо как минимум скомпилировать отдельные исполняемые файлы для каждой комбинации платформы и процессора, которые вы хотите поддерживать, независимо от дополнительных требований библиотек, которые вы используете.