Bastante el título lo resume todo.

No estoy seguro de la diferencia entre los dos si me gustaría utilizar una biblioteca.

Gracias!

  • Por favor, aclarar tu pregunta con el ejemplo.
  • Este es un «manzanas y naranjas» de comparación. Son completamente ajenos cosas. Por favor, añadir un poco de contexto aquí.
  • Tuve una similar confusión acerca de esto, así que creo que es relevante. Para los novatos completo, esta es una buena información, especialmente cuando se responde tan bien por @Matteo Italia.
  • Leer Levine libro Enlazadores y Cargadores
InformationsquelleAutor Setheron | 2011-08-17

3 Comentarios

  1. 50

    En general, necesita tanto.

    Incluir archivos contienen declaraciones de tipos, los prototipos de las funciones, inline funciones, #defines, …, en general toda la información acerca de la biblioteca de la compilador necesidades a tener en cuenta al compilar los archivos.

    Bibliotecas estáticas, en su lugar, contiene el código objeto de las funciones de la biblioteca. Si los encabezados contienen los prototipos, las bibliotecas estáticas contienen el (compilado) definiciones de las funciones, es decir, los módulos de objeto que el enlazador se enlace con la suya.

    Si sólo se incluye el archivo de cabecera sin vinculación con la biblioteca estática, el enlazador se quejan sobre la falta de definiciones, porque sería utilizar las funciones de declarado en la cabecera, pero no definido en cualquier lugar (=sin aplicación). Por otro lado, si sólo enlaza a la biblioteca estática sin proporcionar el encabezado, el compilador se queja desconocido identificadores, ya que no tienen ni idea acerca de la biblioteca de símbolos que usted está utilizando.

    El concepto es muy similar a cuando se compila un multi-archivo de proyecto: para acceder a las definiciones que se escribió en otro .cpp usted necesita incluir un encabezado con sus declaraciones, y que el conector en el extremo de los enlaces de los diferentes módulos de objeto.

    Tan lejos como dll se refiere, generalmente, por un biblioteca de importación es proporcionada; las bibliotecas de importación son como bibliotecas estáticas, pero, en lugar de contener todo el código de la biblioteca, que contienen pequeñas talones que llamar a las funciones en el archivo dll. Cada vez que una llamada a una función de la biblioteca se encuentra en uno de sus módulos de objeto, el enlazador se dirige a la punta, que a su vez redirige al código en el archivo dll1. Todos en todos, cuando se trabaja con archivos dll en Windows normalmente tiene una .h (prototipos/…), un .lib (importación de la biblioteca de enlace en contra, contiene los talones) y un .dll (dinámica de vinculación de la biblioteca que contiene el código real de la biblioteca).

    Por el camino, algunas bibliotecas son «header solo» (usted puede encontrar muchos de refuerzo), lo que significa que todo su código se coloca en la cabecera, así que no hay biblioteca estática es necesaria. Estas bibliotecas son a menudo sólo el hecho de código en línea (funciones/clases/…) y plantillas, para que no se separa la definición es necesaria.

    A menudo esto se hace porque las bibliotecas estáticas son feos bestias por varias razones:

    • tienes que vincula explícitamente en contra de ellos;
    • ya que están vinculados directamente a su código, tienen que usar exactamente la misma C/C++ biblioteca de tiempo de ejecución, lo que significa que, al menos en Windows, no es práctico para distribuir las bibliotecas estáticas (compiladores diferentes, diferentes versiones de compilador, diferentes configuraciones de la misma compilador utilizar diferentes bibliotecas estándar, la difusión de una biblioteca estática para cada combinación de estos aspectos sería práctico, al menos);
    • debido a esto, en general, puede ser primera compilar en su propia versión de la biblioteca estática y, a continuación, enlace en contra de ella.

    Comparar todo esto con solo incluir un archivo de encabezado… 🙂


    1. En realidad, moderno toolchains puede reconocer estos talones y evitar el extra de indirección paso. Ver esta serie por Raymond Chen para más detalles.
    • Maravilloso, explicación Detallada. Impresionante 🙂
    • gracias! 🙂
    • muy, muy buena explicación
  2. 23

    La compilador necesita saber los directorios de inclusión, ya que ésta debe incluir el encabezado (interfaz) los archivos de las bibliotecas que desea utilizar.

    La enlazador necesita saber los directorios de biblioteca, ya que se necesita para vincular a su ejecutable a la (precompilado) aplicación de la biblioteca.

    Ver también ¿Cuáles son las diferencias entre un compilador y enlazador?

    • +1. Simple y convincente. 🙂
    • Eso es lo que ellos llaman la abstracción.
    • A veces me confunden los dos, así que tengo un refrán que dice «Linker le Gusta Bibliotecas» Si alguien tiene un mnemoic para el compilador, por lo que me gustaría escuchar.
  3. 3

    Incluir directorios son sólo para los archivos de cabecera, que suelen proporcionar la función/método de firmas sólo. Es necesario vincular a una biblioteca para tener acceso a su código objeto.

    Ver esta pregunta.

    • así Dll se da como el .dll y los archivos de cabecera de siempre?

Dejar respuesta

Please enter your comment!
Please enter your name here