una programacion librerías librerias libreria lenguaje estatica entre dinámicas dinamica diferencia dev desarrolladas crear crea con compilar como clases biblioteca c++ visual-studio visual-studio-2010

programacion - libreria estatica y dinamica c++



Símbolos de depuración de biblioteca estática (5)

Ampliando las respuestas anteriores, para aquellos que necesitan el completo "cómo hacerlo" (VS 2013).

Tenga en cuenta que esto debería abordar los comentarios ^^ arriba con respecto a los problemas VS2013.

Método 1: La base de datos del programa (.pdb) Way (/ Zi o / ZI)

  1. Proyecto Lib estático: genere un pdb con el mismo nombre que su lib estática:

    • Abra Solution Explorer en el menú View .
    • Haga clic derecho en su proyecto de lib estática, seleccione Properties
    • Editar Configuration Properties -> C/C++ -> General -> Debug Information a /Zi o /ZI
      • Tenga en cuenta que /ZI permite la edición "Editar y Continuar" durante la depuración
    • Editar Configuration Properties -> C/C++ -> Output Files -> Program Database File Name a $(OutDir)$(TargetName).pdb
    • Ahora compílelo y observe dónde están YourLib.lib y YourLib.pdb.
  2. Proyecto de aplicación: enlace su ejecutable con la lib estática y el nuevo archivo PDB :

    • De nuevo, navegue hasta las propiedades del proyecto, pero esta vez, para su proyecto de Aplicación
    • De nuevo, edite Debug Information propiedad Debug Information según sea necesario.
    • Edite Configuration Properties -> Linker -> General -> Additional Library Directories , agregue su propio directorio "libs", o el directorio que desee conservar / copiar sus archivos YourLib.lib y YourLib.pdb.
    • Editar Configuration Properties -> Linker -> Input -> Additional Dependencies , agregando YourLib.lib (sin ruta al frente)
    • Ahora copie YourLib.lib y YourLib.pdb en el directorio que especificó anteriormente.

Método 2: Los símbolos incrustados (no .pdb) Way (/ Z7)

  1. Proyecto Static Lib: Genera una lib estática con símbolos de depuración incorporados

    • Como en el Método 1, navegue a las propiedades del proyecto
    • Como en el Método 1, modifique su Debug Information , pero esta vez para /Z7
    • Como en el Método 1, compile y anote dónde se genera YourLib.lib.
  2. Proyecto de aplicación: Enlace su ejecutable con la lib estática

    • Como en el Método 1, navegue a las propiedades del proyecto
    • Como en el Método 1, modifique su propiedad de Debug Information según sea necesario
    • Como en el método 1, edite los Additional Library Directories
    • Como en el Método 1, edite Additional Dependencies
    • Ahora copie YourLib.lib en el directorio especificado en los directorios Additional Library Directories

Discusión:

  • Ventajas de Z7? Es más simple, y la forma de hacerlo de "un solo archivo". Toda la información de depuración está en el archivo lib.
  • Desventajas de Z7? Tamaño de archivo en disco, tiempos de enlace, incompatible con la característica "Reconstrucción mínima" (/ Gm), no permite "Editar y continuar", formato anterior (por ejemplo, paradigma anterior)
  • ¿Por qué no especifico Debug Information Configuración de Debug Information para el Proyecto de aplicación? Esta publicación se refiere a cómo obtener la depuración trabajando en código de lib estático. La misma opción "Método 1 vs Método 2" también se aplica al proyecto de la Aplicación.

En VS2010 hay una opción para generar información de depuración para exes / dlls bajo linker, pero no existe tal opción en librarian para libs. ¿La información de depuración está incrustada en la biblioteca estática?

Existe una opción en las propiedades de C / C ++ para el nombre de archivo de la base de datos del programa para libs, exes y dlls. Por defecto, va a mi directorio intermedio y se llama nombre de proyecto para libs, pero se llama vc $ (PlatformToolsetVersion) .pdb para exes / dlls. ¿Cuál es el pdb de esta opción y cómo difiere de la pdb en la opción del enlazador?

Si estoy suministrando una biblioteca con libs y encabezados, ¿cómo puedo suministrar símbolos de depuración a un usuario de mi biblioteca?


Comportamiento extraño en VS2012. Construir desde cero (o con la opción / A en nmake) producirá un archivo .pdb. Ahora elimine .lib y .pdb y vuelva a ejecutar nmake (sin / A, por supuesto, para ejecutar solo el enlace) y no se emite ningún archivo .pdb.


Las bibliotecas estáticas se implementan en los programas que las utilizan.

Si el programa que los usa está utilizando símbolos de depuración, el código de la biblioteca compilada en ese programa también tendrá símbolos.

Información de PDB de la wikipedia:

Cuando los símbolos de depuración están incrustados en el binario, el archivo puede crecer significativamente más (algunas veces en varios megabytes). Para evitar este tamaño adicional, los compiladores modernos y los primeros sistemas de depuración de mainframe generan la información simbólica en un archivo separado; para los compiladores de Microsoft, este archivo se llama archivo PDB.


Noté en VS2013 que es posible establecer el nombre del archivo de la base de datos del programa en la pestaña Archivos de salida de C / C ++. Cambiarlo de forma predeterminada a algo como $ (OutDir) $ (TargetName) .pdb resuelve el problema


Si usa /ZI o /Zi ( C/C++ -> General -> Debug Information Format ), se crea vc$(PlatformToolsetVersion).pdb , que contiene la información de depuración para todos los archivos .obj creados. Si alternativamente usa /Z7 , la información de depuración se incrustará en el archivo .obj y luego se incrustará en .lib . Esta es probablemente la forma más fácil de distribuir la información de depuración para una biblioteca estática .

Sin embargo, no recomendaría distribuir una biblioteca estática, ya que generalmente está vinculada a una versión específica del compilador.