En el caso de una biblioteca de importación para un archivo DLL, el archivo .lib hace no contiene ningún código real en absoluto. Básicamente contiene solo una lista de las funciones en la DLL asociada, suficiente para que el enlazador incorpore una referencia a esa DLL en algo relacionado con la biblioteca, pero no mucho más.
Un archivo .exp es un archivo de exportación, básicamente casi lo mismo que un archivo .lib. Se usa (al menos principalmente) cuando tienes una dependencia circular. Por ejemplo, supongamos que tiene una DLL que actúa como complemento de un ejecutable. El ejecutable proporciona algunas funciones exportadas para que las DLL de complemento las utilicen, pero también necesita poder llamar algunas funciones en los complementos (por ejemplo, cargar e inicializar un complemento).
El archivo DLL no se vinculará hasta que el archivo ejecutable se cree para proporcionar un archivo .lib, pero el archivo ejecutable no se vinculará hasta que el archivo DLL se genere para proporcionar un archivo .lib. Para romper la dependencia, ejecute el vinculador contra el ejecutable, que falla (porque no puede encontrar un archivo .lib para la DLL), pero generará un archivo .exp. A continuación, vincula el archivo DLL con el archivo .exp para el ejecutable. A continuación, puede volver a ejecutar el enlace para producir el archivo ejecutable, utilizando el archivo .lib para la DLL.