В попытке представить несколько иной взгляд на другие ответы я отвечу так.
(Отказ от ответственности: я немного упрощаю вещи, ситуация, которую я представляю, является чисто гипотетической и написана как средство демонстрации концепций, а не на 100% верная жизни).
Подумайте о вещах с другой точки зрения, представьте, что вы только что написали простую операционную систему с базовыми возможностями создания потоков, управления окнами и памятью. Вы хотите реализовать библиотеку C ++, чтобы позволить пользователям программировать на C ++ и делать такие вещи, как создание окон, рисование на окнах и т. Д. Вопрос в том, как это сделать.
Во-первых, поскольку C ++ компилируется в машинный код, вам необходимо определить способ использования машинного кода для взаимодействия с C ++. Здесь функции приходят, функции принимают аргументы и возвращают значения, таким образом, они обеспечивают стандартный способ передачи данных между различными разделами кода. Они делают это, создавая нечто, известное как соглашение о вызовах .
А соглашение о вызовах государства , где и как аргументы должны быть размещены в памяти , так что функция может найти их , когда он запускается на выполнение. Когда функция вызывается, вызывающая функция помещает аргументы в память, а затем просит ЦПУ перейти к другой функции, где она делает то, что делает, прежде чем вернуться к тому месту, откуда она была вызвана. Это означает, что вызываемый код может быть абсолютно любым, и это не изменит способ вызова функции. В этом случае, однако, код функции должен относиться к операционной системе и работать во внутреннем состоянии операционной системы.
Итак, спустя много месяцев, и у вас все функции ОС разобраны. Ваш пользователь может вызывать функции для создания окон и рисования на них, они могут создавать темы и всякие замечательные вещи. Но вот в чем проблема, функции вашей ОС будут отличаться от функций Linux или Windows. Таким образом, вы решаете, что вам нужно предоставить пользователю стандартный интерфейс, чтобы он мог писать переносимый код. Вот где приходит QT.
Как вы почти наверняка знаете, в QT есть множество полезных классов и функций для выполнения задач, которые делают операционные системы, но способом, который кажется независимым от базовой операционной системы. Это работает так, что QT предоставляет классы и функции, которые одинаковы в том виде, в котором они отображаются пользователю, но код этих функций различен для каждой операционной системы. Например, QT QApplication :: closeAllWindows () будет фактически вызывать специализированную функцию закрытия окна каждой операционной системы в зависимости от используемой версии. В Windows он, скорее всего, будет вызывать CloseWindow (hwnd), тогда как в ОС, использующей X Window System, он потенциально будет вызывать XDestroyWindow (display, window).
Как видно, операционная система имеет много уровней, каждый из которых должен взаимодействовать через интерфейсы многих разновидностей. Есть много аспектов, которые я даже не затронул, но объяснение их всех заняло бы очень много времени. Если вас больше интересует внутренняя работа операционных систем, я рекомендую проверить OS dev wiki .
Однако имейте в виду, что причина, по которой многие операционные системы предпочитают предоставлять интерфейсы для C / C ++, заключается в том, что они компилируются в машинный код, они позволяют смешивать инструкции по сборке со своим собственным кодом и предоставляют большую степень свободы программисту.
Опять же, здесь много чего происходит. Я хотел бы продолжить, чтобы объяснить, как библиотеки, такие как .so и .dll файлы не должны быть написаны на C / C ++ и могут быть написаны на ассемблере или других языках, но я чувствую, что если я добавлю больше, я мог бы также написать целую статью, и как бы мне этого не хотелось, у меня нет сайта для ее размещения.