Файли lib зчитуються лінкером, а файл dll використовується під час виконання. Файл lib по суті марний під час виконання, а компоновщик не здатний читати файл dll (за винятком, можливо, способу, який тут не має значення).
Різниця між використанням файлів lib для статичного та динамічного зв'язування може заплутати, але якщо ви трохи зрозумієте історію, це стане дуже зрозумілим.
Спочатку існували лише статичні бібліотеки. Для статичної бібліотеки файл .lib містить файли obj. Кожен файл obj є результатом одного і тільки одного вхідного файлу вихідного коду компілятора. Файл lib - це лише сукупність пов'язаних файлів obj, подібно до того, як розмістити файли obj у каталозі. Це по суті те, що таке файл lib, бібліотека файлів obj. Для статичного посилання всі файли obj, які використовує виконуваний файл, об’єднуються в один файл. Порівняйте це з динамічним посиланням, у якому виконуваний файл знаходиться у файлі, окремому від іншого коду, який він використовує.
Для реалізації динамічного зв’язування корпорація Майкрософт модифікувала використання файлів lib таким чином, що вони посилаються на файл dll, а не на розташування у файлі obj. Крім цього, вся інформація, що міститься в бібліотеці для статичного посилання, така ж, як і для динамічного посилання. Всі вони однакові наскільки інформація в них, за винятком того, що файл lib для динамічного посилання визначає файл dll.