Почему C++ программы иногда требуют библиотек, а иногда нет?
Начал изучение С++. Постоянно слышу высказывания, мол программа на С++ запустится даже на голой Windows. Решил проверить. Закинул на чистую виртуалку пару своих .ехе, и заметил, что некоторые программы действительно запускаются и работают как надо, а некоторые выдают исключение из-за отсутствия различных библиотек.
У меня есть предположение, что это из-за Visual C++, которого на виртуалке разумеется нет. Из-за чего же так происходит на самом деле, и если действительно из-за этого, то возможно ли добиться работы программы на полностью чистой винде, если там использовались библиотеки с Visual C++?
Ответы (1 шт):
Программа на C++ без библиотек будет 100% работать на голом железе (если она, конечно, скомпилирована под соответствующее железо, например, архитектура процессора соответствующая).
С другой стороны, программы пишут для того, чтобы они делали что-то полезное. И вот тут мы приходим к тому, что все функции, которые позволяют программам делать что-то полезное бывают 2х видов: написанные вручную и существующие в операционной системе.
Приведу пример, чтобы было яснее. Допустим, мы решили выделить динамическую память. Как это может быть сделано? - Есть 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, то такой код не потребует никаких дополнительных предустановленных в ОС библиотек для своей работы.