El vinculador lee un archivo lib y se usa un archivo dll durante la ejecución. Un archivo lib es esencialmente inútil durante la ejecución y un enlazador es incapaz de leer un archivo dll (excepto posiblemente de una manera irrelevante aquí).
Las diferencias entre el uso de archivos lib para enlaces estáticos y dinámicos pueden ser confusas, pero si comprende un poco de historia, se vuelve muy claro.
Originalmente solo existían bibliotecas estáticas. Para una biblioteca estática, el archivo .lib contiene archivos obj. Cada archivo obj es la salida de un solo archivo de entrada de código fuente del compilador. Un archivo lib es solo una colección de archivos obj relacionados, muy parecido a colocar archivos obj en un directorio. Eso es esencialmente lo que es un archivo lib, una biblioteca de archivos obj. Para un enlace estático, todos los archivos obj que utiliza un ejecutable se combinan en un solo archivo. Compare eso con un enlace dinámico en el que el ejecutable está en un archivo separado del otro código que usa.
Para implementar la vinculación dinámica, Microsoft modificó el uso de archivos lib de manera que se refieran a un archivo dll en lugar de ubicaciones en un archivo obj. Aparte de eso, toda la información que hay en una biblioteca para un enlace estático es la misma que para un enlace dinámico. Todos son iguales en cuanto a la información que contienen, excepto que un archivo lib para un enlace dinámico especifica el archivo dll.