He estado involucrado en un debate con respecto a las bibliotecas en Linux, y me gustaría confirmar algunas cosas.
Según tengo entendido (corríjame si me equivoco y editaré mi publicación más tarde), hay dos formas de usar las bibliotecas al crear una aplicación:
- Bibliotecas estáticas (archivos .a): en el momento del enlace, una copia de toda la biblioteca se coloca en la aplicación final para que las funciones dentro de la biblioteca estén siempre disponibles para la aplicación que realiza la llamada.
- Objetos compartidos (archivos .so): en el momento del enlace, el objeto solo se verifica contra su API a través del archivo de encabezado (.h) correspondiente. La biblioteca no se usa realmente hasta el tiempo de ejecución, donde se necesita.
La ventaja obvia de las bibliotecas estáticas es que permiten que toda la aplicación sea autónoma, mientras que el beneficio de las bibliotecas dinámicas es que el archivo ".so" puede reemplazarse (es decir, en caso de que deba actualizarse debido a una seguridad error) sin requerir que se vuelva a compilar la aplicación base.
He oído que algunas personas hacen una distinción entre objetos compartidos y bibliotecas vinculadas dinámicas (DLL), a pesar de que ambos son archivos ".so". ¿Hay alguna distinción entre los objetos compartidos y las DLL cuando se trata del desarrollo de C / C ++ en Linux o en cualquier otro sistema operativo compatible con POSIX (es decir: MINIX, UNIX, QNX, etc.)? Me dijeron que una diferencia clave (hasta ahora) es que los objetos compartidos solo se usan en tiempo de ejecución, mientras que los DLL deben abrirse primero usando la llamada dlopen () dentro de la aplicación.
Finalmente, también escuché que algunos desarrolladores mencionan "archivos compartidos", que, según tengo entendido, también son bibliotecas estáticas, pero una aplicación nunca los usa directamente. En cambio, otras bibliotecas estáticas se vincularán con los "archivos compartidos" para extraer algunas (pero no todas) funciones / recursos del archivo compartido a la biblioteca estática que se está creando.
Gracias a todos de antemano por su ayuda.
Actualizar
En el contexto en el que se me proporcionaron estos términos, fueron un término efectivamente erróneo utilizado por un equipo de desarrolladores de Windows que tuvieron que aprender Linux. Traté de corregirlos, pero las normas de lenguaje (incorrectas) se quedaron.
- Objeto compartido: una biblioteca que se vincula automáticamente a un programa cuando se inicia el programa, y existe como un archivo independiente. La biblioteca se incluye en la lista de enlaces en tiempo de compilación (es decir,
LDOPTS+=-lmylib
para un archivo de biblioteca llamadomylib.so
). La biblioteca debe estar presente en el momento de la compilación y cuando se inicia la aplicación. - Biblioteca estática: una biblioteca que se fusiona con el programa real en el momento de la compilación para una sola aplicación (más grande) que contiene el código de la aplicación y el código de la biblioteca que se vincula automáticamente a un programa cuando se construye el programa, y el binario final que contiene ambos El programa principal y la biblioteca en sí existe como un único archivo binario independiente. La biblioteca se incluye en la lista de enlaces en tiempo de compilación (es decir,
LDOPTS+=-lmylib
para un archivo de biblioteca llamado mylib.a). La biblioteca debe estar presente en el momento de la compilación. - DLL: esencialmente lo mismo que un objeto compartido, pero en lugar de incluirse en la lista de enlaces en tiempo de compilación, la biblioteca se carga a través de
dlopen()
/dlsym()
comandos para que la biblioteca no necesite estar presente en el momento de la compilación para que el programa compile. Además, la biblioteca no necesita estar presente (necesariamente) en el inicio de la aplicación o en el momento de la compilación , ya que solo se necesita en el momento en que se realizan las llamadasdlopen
/dlsym
. - Shared Archive: esencialmente lo mismo que una biblioteca estática, pero se compila con los indicadores "export-shared" y "-fPIC". La biblioteca se incluye en la lista de enlaces en tiempo de compilación (es decir,
LDOPTS+=-lmylibS
para un archivo de biblioteca llamadomylibS.a
). La distinción entre los dos es que este indicador adicional es necesario si un objeto compartido o DLL desea vincular estáticamente el archivo compartido en su propio código Y poder hacer que las funciones en el objeto compartido estén disponibles para otros programas, en lugar de solo usarlos interno a la DLL. Esto es útil en el caso de que alguien le proporcione una biblioteca estática y desee volver a empaquetarla como SO. La biblioteca debe estar presente en el momento de la compilación.
Actualización adicional
La distinción entre " DLL
" y " shared library
" era solo un coloquialismo (vago, inexacto) en la empresa en la que trabajaba en ese momento (los desarrolladores de Windows se vieron obligados a cambiar al desarrollo de Linux, y el término se atascó), cumpliendo con las descripciones mencionadas anteriormente.
Además, el " S
" literal final después del nombre de la biblioteca, en el caso de los "archivos compartidos" era solo una convención utilizada en esa compañía, y no en la industria en general.
.a
archivos, la "a" en realidad significa "archove", y es simplemente un archivo de archivos de objetos. Los enlazadores modernos deberían ser lo suficientemente buenos como para no necesitar incluir la biblioteca while, solo los archivos de objetos en el archivo que se necesitan, e incluso podrían simplemente usar las secciones de código / datos en los archivos de objetos a los que se hace referencia.