visual studio entre diferencia debug create visual-studio debugging visual-c++ visual-c++-2010 compiler-options

visual-studio - entre - create release visual studio 2017



¿La opción g++ ''s-g equivale al compilador VS2010 cl? (2)

Hay algunas partes separadas de esta pregunta: cómo decirle al compilador / vinculador que genere y conserve "información de depuración" (mapeo entre el código fuente y el código objeto), cómo decirle al compilador que compile el código de manera diferente para facilitar la depuración ( piense en assert () y #ifdef _DEBUG), y si las bibliotecas precompiladas que vincula en su proyecto incluyen información de depuración.

-Zi (el indicador para el compilador CL para indicar que genere información de depuración) es el equivalente del indicador -g de gcc.

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

Tenga en cuenta que el uso de la opción -Zi (o -ZI) generará un archivo .pdb por directorio, generalmente, pero cuando vincula el código, puede provenir de archivos .obj representados en diferentes archivos .pdb, y también desea combine esos archivos .pdb separados en uno maestro que represente el código que unió entre sí: para eso está el conmutador -debug para el enlazador.

También tenga en cuenta: esto puede parecer contrario a la intuición, 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, ni revela 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 alguna vez tengas que depurarlo, querrás el .pdb. (-Zi ni siquiera es incompatible con las optimizaciones, aunque -ZI sí lo es. Por lo tanto, es posible que desee compilar sus compilaciones "debug" con -ZI, y su "versión" compila con "-Zi -O2".)

En cuanto a las bibliotecas: no es necesario que coincida estrictamente con la propiedad debug / release de la biblioteca en tiempo de ejecución de C con si el 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 lo vas a depurar no necesitas el peso adicional. El uso de versiones de debug / release de una biblioteca dada no afectará si tiene símbolos de depuración disponibles (con suerte, si quien compiló la biblioteca entendió el punto que mencioné en el párrafo anterior), pero afectará cosas como afirmar y extra #ifdef _DEBUG Código en esa biblioteca.

Esto se aplica a todas las bibliotecas con las que se vincula, pero especialmente a la biblioteca en tiempo de ejecución de C: Microsoft agregó un código de detección de errores adicional a malloc () y free (). Por lo tanto, si algo en su proyecto está utilizando la opción de depuración de la biblioteca CRT, todo debería estarlo.

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

Con g ++ con la opción -g , puedo usar gdb para propósitos de depuración.

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

Esta page tiene diferentes librerías (debug / release) para enlazar.

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


Está buscando una de las opciones de generación de información de depuración ( /Z7 , /Zi o /ZI ).

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

También deberá vincularse con la versión de depuración de las bibliotecas de tiempo de ejecución ( /MDd o /MTd ). Esto es importante porque estas versiones son diferentes de sus contrapartes de lanzamiento (por ejemplo, sus rutinas de asignación de memoria no son compatibles).