bibliotecas compartidas son .so (o en Windows .dll, o en OS X .dylib) archivos. Todo el código relacionado con la biblioteca se encuentra en este archivo, y los programas que lo utilizan lo hacen referencia en el tiempo de ejecución. Un programa que usa una biblioteca compartida solo hace referencia al código que usa en la biblioteca compartida.
Las bibliotecas estáticas son archivos .a (o en Windows .lib). Todo el código relacionado con la biblioteca está en este archivo y está directamente vinculado al programa en tiempo de compilación. Un programa que utiliza una biblioteca estática toma copias del código que utiliza de la biblioteca estática y lo hace parte del programa. [Windows también tiene.archivos lib que se utilizan para hacer referencia a archivos .dll, pero actúan de la misma manera que el primero].
Existen ventajas y desventajas en cada método.
Las bibliotecas compartidas reducen la cantidad de código que se duplica en cada programa que hace uso de la biblioteca, manteniendo los binarios pequeños. También le permite reemplazar el objeto compartido por uno que sea funcionalmente equivalente, pero puede haber agregado beneficios de rendimiento sin la necesidad de recompilar el programa que lo usa. Las bibliotecas compartidas, sin embargo, tendrán un pequeño costo adicional para la ejecución de las funciones, así como un costo de carga en tiempo de ejecución, ya que todos los símbolos de la biblioteca deben estar conectados a las cosas que usan. Además, las bibliotecas compartidas se pueden cargar en una aplicación en tiempo de ejecución, que es el mecanismo general para implementar sistemas de complemento binarios.
Las bibliotecas estáticas aumentan el tamaño general del binario, pero significa que no necesita llevar consigo una copia de la biblioteca que se está utilizando. Como el código está conectado en tiempo de compilación, no hay costos adicionales de carga en tiempo de ejecución. El código está simplemente allí.
Personalmente, prefiero las bibliotecas compartidas, pero uso las bibliotecas estáticas cuando necesito asegurarme de que el binario no tiene muchas dependencias externas que pueden ser difíciles de cumplir, como versiones específicas de la biblioteca estándar de C++ o versiones específicas de Boost Biblioteca C++.
Wikipedia tiene una [buena descripción] (http://en.wikipedia.org/wiki/Library_%28computing%29) de la distinción entre bibliotecas estáticas, dinámicas y compartidas. –