Что требуется для запуска программы на C++?

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

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

и

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

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

8 ответов


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


для приложений Windows, вы можете использовать Зависимость Walker для просмотра всех зависимостей.


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

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

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


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

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


скомпилируйте их с помощью 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)

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

  • Для начала, вам понадобится компьютер с совместимый процессор это работает с целевой машиной вывода компилятора. Вы можете подумать, что это очевидно, но предполагая, что код компилируется в машинный код x86, он не будет работать на Альфа-процессоре, который использует разные инструкции. Кроме того, если вы компилируете машинный код x64, он не будет работать только на процессоре x86. Итак, правильное оборудование необходимо запустить программу на C++, в отличие от языков на базе виртуальных машин, таких как Java, которые абстрагируют это.

  • Вам также понадобится правильный операционные системы. Я не эксперт по переносу программ, но я не думаю, что можно создать один исполняемый файл, который работает на нескольких операционных системах в C++. Например, компиляция даже вашего второго примера в Windows будет иметь много кода библиотеки времени выполнения за кулисами до и после фактического вызова вашего . Это будет делать такие вещи, как подготовка кучи и инициализация библиотеки CRT. CRT для Windows реализуется через API Windows. Вы можете статически связать библиотеку, чтобы не требовалась библиотека CRT, но код в вашей программе по-прежнему вызывает API Windows, поэтому по-прежнему зависит от платформы. В качестве эксперимента я скомпилировал пустую программу со статической связью в Windows с Visual Studio, и, согласно Dependency Walker, она по-прежнему ссылается На kernel32.DLL для таких функций, как HeapCreate и ExitProcess. Таким образом, "пустая" программа все еще делает для вас целую кучу вещей операционной системы, готовясь сделать что-то полезное (независимо от того, делает ли ваша программа что-то полезное).

также обратите внимание, что может быть минимальная версия операционной системы: Visual Studio 2010 требует Windows XP SP2 или выше даже для пустой программы из-за вызовов EncodePointer и DecodePointer. См.этот вопрос.

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

  • в зависимости от конфигурации операционной системы может потребоваться достаточно!--11-->привилегии безопасности для запуска исполняемых программ.

короче говоря, чтобы запустить пустую программу на C++ даже со статической связью, вам нужен правильный процессор, операционная система, разрешение на запуск исполняемого файла и время памяти/обработки для завершения программы. По сравнению с VM-технологиями, такими как Java или .NET, требования сократятся до, вероятно, только правильной виртуальной машины, необходимых привилегий и необходимого времени памяти / процессора для запуска программа. Это может быть не так просто, как кажется: вам может понадобиться правильный версия виртуальной машины, например .NET framework 4.0. Это может усложнить процесс распространения, поскольку обновление всей JVM или .NET framework для машины может занять много времени, требуя прав администратора и, возможно, подключения к интернету. В некоторых узких случаях это может быть нарушением сделки, так как в редких случаях может быть проще сказать: "он будет работать на любом x86-совместимая операционная система Windows с XP "в отличие от"любой машины с последней виртуальной машиной, которая была выпущена только вчера". Для большинства целей, однако, тот факт, что виртуальная машина позволяет (теоретически) забыть о процессоре и операционной системе, облегчает распространение программы; с C++ вы должны по крайней мере компилировать отдельные исполняемые файлы для каждой комбинации платформы и процессора, которые вы хотите поддерживать, независимо от дополнительных требований библиотеки вы используете.


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

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

но в целом, что ему нужно, это хорошо определенное адресное пространство (в основной памяти), его свойства и время процессора. Операционная система гарантирует, что вы получите это когда вы выполняете свою программу. Если нет какого-то смешного конфликта, ваша программа получит это (и поэтому я думаю, что Chubsdad прокомментировал "вам нужна удача").

планирование ОС, CPU просит получить инструкции / данные из памяти, а затем выполнить его... все формирует "машину", которая выполняет вашу программу.

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


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

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