Pregunta

Con g ++ con -g opción , puedo usar gDB para la depuración.

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

Esta página tiene diferentes bibliotecas (debug / release) para la vinculación.

Si puedo compilar con la opción de depuración con cl.exe, tengo que utilizar la biblioteca correspondiente vinculación de opciones (/ MD / MT vs / MDd / MTD)?

¿Fue útil?

Solución

Hay algunas piezas separadas a esta pregunta: ¿cómo decirle al compilador / enlazador para generar y preservar "la información de depuración" (mapeo entre el código fuente y código objeto), cómo hacer que el compilador para compilar el código diferente para hacer más fácil la depuración (piensa en assert () y _DEBUG #ifdef), y si las bibliotecas precompilados que enlace a su proyecto incluyen información de depuración.

Zi (bandera para el compilador de CL para indicarle que debe generar información de depuración) es el equivalente de la bandera -g de gcc.

(Hay otras formas de la opción -Z: -Zi si desea que el "Editar y continuar" apoyo en el IDE de Visual Studio, pero si usted está utilizando el IDE Probablemente se esté usando su interfaz para el compilador ajustes en vez de manipular directamente, y -Z7 si quieren que la información antigua de depuración de CodeView-formato, siempre que he invocado directamente CL siempre ha sido -Zi que quería)

.

Tenga en cuenta que el uso de la opción Zi (o Zi) generará un archivo .pdb por directorio, por lo general, pero cuando se vincula código juntos, que puede provenir de archivos .obj representados en diferentes archivos .pdb, y usted también quieren combinar esos archivos .pdb independientes en un un maestro que representa el código que unidos entre sí -. esto es lo que el interruptor -debug para el enlazador es para

También nota: esto puede parecer contradictorio, pero siempre use Zi (CL) y -debug (por link.exe). Incluso para el código que va a liberar. No aumenta el tamaño de su ejecutable, o regalar secretos a sus clientes, ya que la información de depuración va en un archivo .pdb separada (que no se enviará a los clientes). Si hay alguna posibilidad de que alguna vez va a tener para depurarlo, vas a querer la .pdb. (Zi ni siquiera es incompatible con optimizaciones, aunque es -Zi. Así que es posible que desee compilar su "depuración" construye con Zi, y su "liberación" se construye con "-Zi -O2".)

En cuanto a las bibliotecas: no es necesario estrictamente a coincidir con la propiedad de depuración / liberación de la biblioteca de tiempo de ejecución C con el hecho de que su código incluye información de depuración, pero por lo general es una buena idea - si se va a depurar el proyecto que desea ser capaz de depurar todos de la misma, y ??si no se va a depurar que no es necesario el peso extra. El uso de versiones de depuración / liberación de una biblioteca dada no afectará si tiene símbolos de depuración disponibles (con suerte, si el que compiló la biblioteca entendido lo que he dicho en el párrafo anterior), pero afectará cosas como afirmar y _DEBUG #ifdef adicional código en esa biblioteca.

Esto va para todas las bibliotecas que enlace con, pero sobre todo para la biblioteca de tiempo de ejecución C - Microsoft añadió código de detección de errores adicional para malloc () y free (). Así que si hay algo en su proyecto utiliza el sabor de depuración de la biblioteca CRT, todo ello debería ser.

Las opciones / M (/ MTd y / TDM) es extraña y mágica, en mi opinión - Son sólo alias para un conjunto complicado de otras cosas pasando detrás de las escenas. Tome / MDd por ejemplo, documentó que "define _DEBUG, _MT y _DLL y hace que su aplicación para utilizar la versión multithread- y DLL-específico de la biblioteca de tiempo de ejecución de depuración. También hace que el compilador para colocar el nombre de la biblioteca MSVCRTD. lib en el archivo .obj ". Aquí, está afectando tanto el preprocesador (_DEBUG definir y algunos otros símbolos del preprocesador) y el enlazador (que en realidad pone un #pragma comment (linker) en el código fuente). Si se preocupan por lo que está pasando y no lo entiende, esto puede causar problemas reales - He visto una gran cantidad de proyectos que no utilizan el IDE conseguir empantanado en las advertencias sobre ambas msvcrt.lib y MSVCRTD.LIB siendo vinculado en, etc. en el momento de entender cómo usar estas opciones (/ M) de manera segura, usted realmente no los necesita más! Prefiero hacer las cosas explícito: especificar "-D _DEBUG" directamente cuando lo necesito, especificar qué bibliotecas de enlace con forma explícita (y el uso -nodefaultlib), y luego no se necesitan las opciones / M

.

Otros consejos

Usted está en busca de uno de los depuración opciones de generación de información (/Z7, /Zi o /ZI).

Si se utiliza uno de esos, también debe pasar el / opción de depuración al enlazador.

También necesitará enlace en contra de 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 homólogos de liberación (por ejemplo sus asignaciones de memoria rutinas no son compatibles).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top