Что требуется для запуска программы на C ++? - PullRequest
13 голосов
/ 15 октября 2010

Этот вопрос уже давно беспокоит меня.Давайте рассмотрим две следующие программы:

#incude <iostream>
int main()
{
   std::cout << "Hello, World!";
}

и

int main()
{
   int x = 5;
   int y = x*x;
}
  1. Windows: первый пример, естественно, требует наличия некоторых системных .dll для консоли.Я это понимаю.Как насчет второго?Нужно ли что-нибудь для запуска?Некоторые библиотеки времени выполнения?Кстати, что на самом деле делают библиотеки времени выполнения?
  2. Linux: Понятия не имею, можете ли вы просветить меня?

Я знаю, что это зависит от компилятора и ОС, но мне нужно либообщий ответ или конкретные примеры.ТИА.

Ответы [ 8 ]

7 голосов
/ 15 октября 2010

Для приложений Windows вы можете использовать Dependency Walker , чтобы увидеть все зависимости.

7 голосов
/ 15 октября 2010

Как общий ответ, для первого потребуются библиотеки времени выполнения C ++ (то, что вам нужно для поддержки вызовов стандартных библиотек).Они образуют своего рода интерфейс между языком и библиотеками поддержки , которые, в свою очередь, знают, как добиться того, что они делают в данной среде.

Второе делаетне использовать библиотеки времени выполнения.Он будет использовать код запуска и завершения C (который инициализирует и разрушает среду C), но это дискуссионный вопрос о том, считаются ли они частью библиотек времени выполнения.Если вы считаете их частью, то да, они будут использованы.Вероятно, это будет очень небольшая используемая часть, так как обычно существует большой размер по размеру между кодом запуска и вещами потоков.

Вы можете связать свой код статически (связывание во время ссылки) сбиблиотеки времени выполнения или динамически (так что фактическое связывание выполняется во время загрузки).Это верно как для Windows, так и для Linux.

2 голосов
/ 15 октября 2010

Хорошо, давайте посмотрим на это с более общей точки зрения:

  • Для начала вам понадобится компьютер с совместимым процессором , которыйработает с целевой машиной вывода компилятора.Вы можете подумать, что это очевидно, но при условии, что код компилируется в машинный код 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 ++ вам необходимо как минимум скомпилировать отдельные исполняемые файлы для каждой комбинации платформы и процессора, которые вы хотите поддерживать, независимо от дополнительных требований библиотек, которые вы используете.

2 голосов
/ 15 октября 2010

Скомпилируйте их с помощью GCC и получите исполняемый файл с именем 'hi', в консоли запишите:

ldd hi

выдаст вам общие объекты (динамические библиотеки), которые подключены к вашей программе.

Просто для быстрого ответа вот вывод:

ldd tifftest
  libtiff.so.3 => /usr/lib/libtiff.so.3 (0x4001d000)
  libc.so.6 => /lib/libc.so.6 (0x40060000)
  libjpeg.so.62 => /usr/lib/libjpeg.so.62 (0x40155000)
  libz.so.1 => /usr/lib/libz.so.1 (0x40174000)
  /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
2 голосов
/ 15 октября 2010

Первая программа выполняет потоковый ввод / вывод, что означает, что она должна взаимодействовать с ресурсами (console, gui), управляемыми ОС. Таким образом, в конечном счете, ОС должна вызываться через API, реализованный в системной DLL.

В Windows вторая программа не требует библиотек. Я вполне уверен, что то же самое верно для Linux.

1 голос
/ 15 октября 2010

В Linux любая программа на C статически связана с некоторыми библиотеками CRT.Истинной точкой входа в программу является функция _start(), определенная в /usr/lib/crt1.o.Эта функция вызывает некоторые функции libc, такие как __libc_start_main().Таким образом, вам все еще нужна библиотека libc ...

Вы можете обойтись без libc, но это сложно.Вам нужно будет переименовать вашу точку входа _start() или дать указание компоновщику начать с main().И вам также потребуется некоторая встроенная сборка, чтобы выполнить системный вызов _exit(), когда программа будет завершена, иначе она просто вылетит.И, конечно же, сделайте ссылку явно с помощью команды ld, а не через gcc внешний интерфейс.

1 голос
/ 15 октября 2010

Для 1-й части вашего вопроса - вам ответили несколько человек. Но то, что я говорю, является общим и обязательным для обоих случаев - (если вы не знаете)

Для запуска любой программы она должна быть обеспечена необходимыми ресурсами. При ответе на 1-ю часть команда уже перечислила несколько пунктов.

Но, в общем, ему нужно четко определенное адресное пространство (в основной памяти), его свойства и время процессора. Операционная система гарантирует, что вы получите это при выполнении вашей программы. Если не произойдет какой-то нелепый конфликт, ваша программа получит это (и поэтому я думаю, что Чубсдад прокомментировал «тебе нужна удача»).

Планирование ОС, CPU, запрашивающий извлечение инструкций / данных из памяти и затем выполняющее их ... все образует «машину», которая выполняет вашу программу.

Поиск точки входа (или первой точки в вашей программе для выполнения) - это все, что решается либо во время компиляции (например, для основной функции), либо во время загрузки вашей программы с помощью какого-либо системного вызова, такого как exec () (в Unix). / CreateProcess () (в окнах).

1 голос
/ 15 октября 2010
Для программ

C в Windows требуются библиотеки CRT, поставляемые с Windows.C ++ иногда требует так называемого «C ++ redistributable».Они могут быть встроены в приложение через ссылки, но это сделает EXE больше.

...