Почему C++ программы иногда требуют библиотек, а иногда нет?

Начал изучение С++. Постоянно слышу высказывания, мол программа на С++ запустится даже на голой Windows. Решил проверить. Закинул на чистую виртуалку пару своих .ехе, и заметил, что некоторые программы действительно запускаются и работают как надо, а некоторые выдают исключение из-за отсутствия различных библиотек.

У меня есть предположение, что это из-за Visual C++, которого на виртуалке разумеется нет. Из-за чего же так происходит на самом деле, и если действительно из-за этого, то возможно ли добиться работы программы на полностью чистой винде, если там использовались библиотеки с Visual C++?


Ответы (1 шт):

Автор решения: VladimirS

Программа на C++ без библиотек будет 100% работать на голом железе (если она, конечно, скомпилирована под соответствующее железо, например, архитектура процессора соответствующая).

С другой стороны, программы пишут для того, чтобы они делали что-то полезное. И вот тут мы приходим к тому, что все функции, которые позволяют программам делать что-то полезное бывают 2х видов: написанные вручную и существующие в операционной системе.

Приведу пример, чтобы было яснее. Допустим, мы решили выделить динамическую память. Как это может быть сделано? - Есть 2 способа:

  1. Написать свой менеджер памяти (и изрядную часть функциональности собственной операционной системы) внутри программы, которые запускать на голом железе.
  2. Использовать возможности операционной системы, т.е. память нам выделять будет ОС.

Отсюда растут уши всяких RunTime-ов - прослоек и библиотек, на разных языках программирования и платформах. Так, у C и C++ есть такая библиотека (которая часто втихаря используется), как CRT ("C Run Time", она же - RTL - "Run time library"). Она предоставляет кучу популярных функций, таких как malloc, free, printf и много чего ещё. "Вот это вот" - внутри - всё равно ("под капотом, втихаря от программиста") вызывает сервисы соответствующей операционной системы.

Так, на Windows, CRT, при вызове, допустим, malloc - вызывает WinAPI функцию выделения памяти (а на Unix и MacOS - их версии CRT - вызывают выделение памяти, функциями этих систем соответственно).

Совершенно аналогично, работают любые GUI библиотеки, любой "кросплатформенный софт" (a'la OpenGL/OpenAL/OpenCL/OpenCV/OpenWhatEver) и т.д. - просто вызывают соответствующие функции, соответствующей ОС "за Вас".

А потому, любой вызов "обёрточного" библиотечного кода потребует (если не прилинкован статически) наличия соответствующей библиотеки/рантайма на целевой системе.

С другой стороны, если, например, под Windows не использовать вообще ничего, кроме WinAPI, то такой код не потребует никаких дополнительных предустановленных в ОС библиотек для своей работы.

→ Ссылка