Las bibliotecas en C++ también se consideran útiles, pero la forma de integrarlas es diferente a Java porque el compilador solo tiene que ver la interfaz de la biblioteca, que generalmente se declara en archivos de encabezado. En Java, el compilador tendrá que inspeccionar las bibliotecas reales porque Java no tiene esta distinción entre un archivo de encabezado visible externamente y el código de objeto generado que proporciona la implementación.
Lo que normalmente hace es compilar las bibliotecas por separado, una vez, y colocar los archivos lib/dll generados más los archivos de encabezado en un lugar al que puedan acceder los proyectos que requieren la biblioteca. Una expresión común es poner los archivos de encabezado en include
, las bibliotecas estáticas en lib
y las bibliotecas dinámicas en los subdirectorios bin
para su biblioteca compilada. El motivo por el que ha encontrado que la mayoría de las bibliotecas C++ se proporcionan en formato de código fuente y no en formato precompilado es que cada compilador C++ tiene cierta libertad sobre cómo manipular nombres de símbolos, etc. y el código objeto resultante no es portátil. a través de compiladores, y mucho menos de sistemas operativos. Así que enviar el código compilado no tiene sentido para muchas aplicaciones. Ocasionalmente lo encontrará con bibliotecas C++ de código cerrado en Windows (las bibliotecas C son un asunto completamente diferente), pero luego el proveedor tendrá que proporcionar una versión compilada para cada tipo de compilación (Release, Debug, 32 bit, 64 bit etc) y el compilador de destino (varias versiones de Visual Studio requieren binarios diferentes, luego está Borland y un montón de otros compiladores) y rápidamente se convierte en una pesadilla para soportar ...
Cuando toma una biblioteca y la compila como una biblioteca dinámica en Windows (es decir, una DLL), el compilador/enlazador normalmente generará una biblioteca de 'importación' estática para él (mismo nombre, solo con una extensión .lib) Cuando vincula su proyecto con la biblioteca dinámica, especifica el archivo .lib como una dependencia de la biblioteca. Al vincular su aplicación con dicha biblioteca de importación, el vinculador puede registrar la dependencia en el archivo .dll y también qué símbolos debe esperar que proporcione la biblioteca.
Hacerlos funcionar, en el sentido de que su programa los encuentre en Windows, generalmente requiere que el archivo .dll esté en el mismo directorio que el ejecutable o accesible mediante la variable de entorno 'PATH' y su equivalente en Visual C++ .
-1 Las bibliotecas que se distribuyen como binarios vienen con una biblioteca de importación (.lib). El cambio de nombre es completamente irrelevante aquí, ya que los nombres de los símbolos se enumeran en el archivo .lib. Si esos símbolos son los nombres destrozados de un compilador (C++), los nombres de exportación de un proveedor como se enumeran en un archivo .def o los símbolos (re) nombrados asignados por el desarrollador en la línea de comando del vinculador (/ EXPORTAR) no hacen un diferencia. Los nombres de los símbolos están disponibles para cualquier vinculador. – IInspectable
@IInspectable: el cambio de nombre puede ser irrelevante, pero las convenciones de llamadas y la biblioteca de tiempo de ejecución no lo son. Si no tiene cuidado al diseñar la biblioteca, puede vincular fácilmente el binario a una versión de compilación específica. –