17

Con g ++ con -g option, puedo usar gdb para depuración.La opción -g de g ++ es equivalente al compilador VS2010 cl?

¿Cuál es el equivalente a esta opción con el compilador cl.exe de Visual Studio 2010?

Este page tiene diferentes bibliotecas (depurar/liberar) para vincular.

Si compilo con la opción de depuración con cl.exe, ¿tengo que usar las opciones de vinculación de biblioteca correspondientes (/ MD/MT vs/MDd/MTd)?

Respuesta

29

Hay algunas piezas separadas para esta pregunta: cómo decirle al compilador/enlazador que genere y preserve la "información de depuración" (mapeo entre código fuente y objeto), cómo decirle al compilador que compile el código de forma diferente Haga que la depuración sea más fácil (piense en assert() y #ifdef _DEBUG), y si las bibliotecas precompiladas que vincula a su proyecto incluyen información de depuración.

-Zi (señalar al compilador CL para indicarle que genere información de depuración) es el equivalente del indicador g-gcc.

(Hay otras formas de la opción -Z: -ZI si desea el soporte para "editar y continuar" en el IDE de Visual Studio, pero si está utilizando el IDE, probablemente esté utilizando su interfaz para el la configuración del compilador en lugar de manipularlos directamente, y -Z7 si desea la antigua información de depuración del formato CodeView; cada vez que invoco CL directamente, siempre ha sido -Zi lo que quería.)

Tenga en cuenta que con -Zi (o la opción -ZI) generará un archivo .pdb por directorio, por lo general, pero cuando vincula un código, puede provenir de archivos .obj representados en diferentes archivos .pdb, y también desea combinar esos archivos .pdb separados en una maestra que representa el código que vinculó, esto es para lo que es el conmutador -debug para el enlazador.

También tenga en cuenta: esto puede parecer contradictorio, pero siempre use -Zi (para CL) y -debug (para link.exe). Incluso para el código que vas a lanzar. No aumenta el tamaño de su ejecutable, o regala secretos a sus clientes, ya que la información de depuración va en un archivo .pdb separado (que no enviará a los clientes). Si hay alguna posibilidad de que tenga que depurarlo, va a querer el .pdb. (-Zi ni siquiera es incompatible con las optimizaciones, aunque -ZI sí. Por lo tanto, es posible que desee compilar sus compilaciones de "depuración" con -ZI, y sus compilaciones de "versión" con "-Zi-O2".)

En cuanto a las bibliotecas: no es necesario que coincida con la propiedad de depuración/liberación de la biblioteca de tiempo de ejecución de C con si su código incluye información de depuración, pero generalmente es una buena idea, si va a depurar el proyecto que desea para poder depurarlo todo, y si no vas a depurarlo, no necesitas el peso extra. Usar versiones de depuración/versión de una biblioteca determinada no afectará si tiene símbolos de depuración disponibles (con suerte, si quien compiló la biblioteca entendió el punto que hice en el párrafo anterior), pero afectará cosas como assert y extra #ifdef _DEBUG código en esa biblioteca.

Esto se aplica a todas las bibliotecas con las que se establece un enlace, pero especialmente para la biblioteca de tiempo de ejecución de C: Microsoft agregó código adicional de detección de errores a malloc() y libre(). Entonces, si algo en su proyecto está utilizando el sabor de depuración de la biblioteca CRT, todo debería ser.

Las opciones/M (/ MTd y/MDd) son extrañas y mágicas, en mi opinión, son solo alias para un conjunto complicado de otras cosas que ocurren detrás de escena. Take/MDd, por ejemplo, documentado como "Define _DEBUG, _MT y _DLL y hace que su aplicación use la versión de depuración multithread y específica de DLL de la biblioteca en tiempo de ejecución. También hace que el compilador coloque el nombre de la biblioteca MSVCRTD. lib en el archivo .obj ". Aquí, afecta tanto al preprocesador (que define _DEBUG como a algunos otros símbolos de preprocesador) y al vinculador (en realidad pone un comentario de #pragma (vinculador) en su código fuente). Si te importa lo que está pasando y no lo entiendes, esto puede causar problemas reales. He visto muchos proyectos que no usan el IDE se atascan en advertencias sobre msvcrt.lib y msvcrtd.lib estar vinculado, etc. Para cuando entiendas cómo usar estas (/ M opciones) de forma segura, ¡ya no las necesitarás más! Prefiero hacer las cosas explícitas: especifique "-D _DEBUG" directamente donde lo necesito, especifique con qué bibliotecas vincularse explícitamente (y use -nodefaultlib), y luego las opciones/M no son necesarias.

+4

+1 Wow. ¿Puedo preguntar cómo te familiarizaste con la idiosincrasia de la cadena de herramientas de Microsoft? :) –

+9

Años y años de usar diferentes versiones de MSVC, muchos proyectos de plataformas cruzadas, así que estábamos usando makefiles o eludiendo el sistema de compilación del IDE, usando librerías de código abierto construidas por terceros, manteniendo todo funcionando en las actualizaciones a las nuevas versiones de MSVC o el SDK, etc. :) – metamatt

6

Está buscando uno de los debug information generation options (/Z7, /Zi o /ZI).

Si usa uno de ellos, también debe pasar la opción /DEBUG al vinculador.

También necesitará vincular el debug version de las bibliotecas de tiempo de ejecución (/MDd o /MTd). Esto es importante porque estas versiones son diferentes de sus contrapartidas de lanzamiento (por ejemplo, sus rutinas de asignaciones de memoria no son compatibles).

Cuestiones relacionadas