Связанная в C Run Time оболочка вокруг вашей «основной» функции; он инициализирует все, что нужно, прежде чем ваш код C может быть запущен. Он не содержит (m) никаких «функций», которые есть в стандартной библиотеке C (которая динамически связана).
Я думаю, вы неправильно понимаете динамическое связывание: оно выполняется ОС. Таким образом, вы сообщаете ОС, что вашему исполняемому файлу нужны DLL a
, b
, c
и d
. Когда вы выполняете свой исполняемый файл, ОС загружает исполняемый файл в ячейку памяти и считывает в исполняемом файле, что необходимо для его запуска. Затем он возьмет эти DLL и вставит их в область памяти вашего исполняемого файла, а затем сообщит вашему коду, что a
загружен в x
, b
загружен в y
и т. Д., Чтобы ваш код мог вызвать его функции.
Иногда компиляторы включают (так называемую статическую компоновку) библиотеку во время компиляции: они делают это так, чтобы ОС не загружала ее во время выполнения и, следовательно, загружала быстрее.
Файлы
.lib
являются файлами DLL без буквы "D", поскольку они могут быть статически связаны. Также возможно динамически связываться с библиотечными файлами; это уменьшает размер исполняемого файла, но замедляет время загрузки исполняемого файла.
О WinAPI: большинство вызовов библиотеки C преобразуются в (некоторые) вызовы в WinAPI; но только если им приходится взаимодействовать с ОС (ввод-вывод и т. д.). Разница в том, что библиотека C одинакова на большинстве платформ, поэтому она увеличивает переносимость, если вы используете библиотеку C вместо Windows API напрямую.
Обновление
Вы спрашивали, как загрузить DLL, если вы полностью динамически связываете свой исполняемый файл? Ну, тебе не нужно! Разница между «загрузкой DLL» и «вызовом загрузки DLL» составляет; «загрузка dll» выполняется ОС при запуске приложения. ОС будет искать ваш исполняемый файл для определенной "таблицы импорта". Это таблица, в которой указывается, какие DLL ей действительно нужны , прежде чем она сможет выполняться (то есть kernel32.dll
или user32.dll
в Windows). ОС сделает "вызов для загрузки DLL", даже до запуска вашего кода.
"Call to load dll" также существует в kernel32.dll
для вашего кода, который будет вызываться: есть возможность загружать / выгружать DLL, пока ваш код работает. Это может иметь место, если у вас огромная база кода и вы хотите освободить память, выгружая эту библиотеку одноразового использования в течение всего времени жизни вашего приложения (например, во время запуска). Если вы больше не используете эту функцию, вы можете выгрузить DLL. Но также возможно, что вам нужна какая-то функция, которую вы еще не загрузили, чтобы ускорить загрузку. Затем вы можете загрузить DLL, если вам нужна эта функция самостоятельно. Это довольно сложный процесс, и большую часть времени ОС все равно будет заменять неиспользуемые DLL-библиотеки (буквально «удаляя» память: она перемещает неиспользуемую память (например, неиспользуемую DLL) в массовое место хранилище, как на жестком диске. Если вам это нужно, оно автоматически «меняет» его обратно!).
Итак: вам не нужно сильно беспокоиться о загрузке / выгрузке DLL в Windows. Если у вас есть хороший компоновщик, и вы скажете ему динамически связываться с библиотеками, все будет работать нормально.