2010-06-24 12 views
9

Mi definición de potente es la capacidad de personalizar.¿Visual C++ es tan poderoso como gcc?

Estoy familiarizado con gcc Quería probar MSVC. Entonces, estaba buscando opciones equivalentes de gcc en msvc. No puedo encontrar muchos de ellos.

hay controlando tipo de salida

Stop after the preprocessing stage; do not run the compiler proper. 
gcc: -E 
msvc: ??? 

Stop after the stage of compilation proper; do not assemble. 
gcc: -S 
msvc: ??? 

Compile or assemble the source files, but do not link. 
gcc: -c 
msvc:/c 

útil para depurar

Print (on standard error output) the commands executed to run the stages of compilation. 
gcc: -v 
msvc: ??? 

Store the usual “temporary” intermediate files permanently; 
gcc: -save-temps 
msvc: ??? 
  1. es una especie de gcc < -> msvc opción de compilador guía mapeo?
  2. gcc Option Summary enumera más opciones en cada sección que Compiler Options Listed by Category. Hay infinidad de cosas importantes e interesantes que faltan en msvc. ¿Me estoy perdiendo algo o msvc es realmente menos poderoso que gcc?
+0

Para el 'gcc -V' caso, mi conjetura es que el compilador msvc es simplemente' cl' para todo, y que no tiene los binarios ejecutables independientes como gcc tiene. –

+18

No veo cómo se puede equiparar "más potente" con "más conmutadores de línea de comandos". –

+0

@Didier Trosset: compilador: cc == cl.exe, ensamblador: as == ml.exe, linker: ld = link.exe. La diferencia es que aquí cl.exe está desempeñando el papel de 'gcc' también. – claws

Respuesta

26

MSVC es un IDE, gcc es solo un compilador. CL (el compilador de MSVC) puede hacer la mayoría de los pasos que está describiendo desde el punto de vista de gcc. CL /? da ayuda.

E.g.

pre-proceso para la salida estándar:

CL /E 

Compilar sin vincular:

CL /c 

Generar montaje (a diferencia de gcc, sin embargo, esto no impide que la compilación):

CL /Fa 

CL es realmente solo un compilador, si desea ver qué comandos genera el IDE para compilar y vincular lo más fácil para mirar la sección de línea de comando de las páginas de propiedades para un elemento en el IDE. CL no llama a un preprocesador o ensamblador por separado, por lo que no hay comandos separados para ver.

Para -save-temps, el IDE realiza compilación separada y vinculando así los ficheros objeto se conservan todos modos. Para preservar la salida del preprocesador y la salida del ensamblador, puede habilitar /P y /Fa a través del IDE.

gcc y CL son diferentes, pero no diría que al MSVC le faltan "muchísimas" cosas, ciertamente no son las salidas que está buscando.

3

Ambos compiladores tienen una gran cantidad de opciones para modificar ... todo. Sospecho que cualquier opción que no esté presente en ninguna de ellas es una opción para algo que no vale la pena hacer en primer lugar. La mayoría de los usuarios "normales" no encuentran un uso para la mayoría de esas opciones de todos modos.

Si solo está mirando el número de opciones disponibles como una medida de "potencia" o "flexibilidad", probablemente encontrará que gcc es el ganador, simplemente porque gcc maneja muchas plataformas además de Windows y tiene opciones específicas para muchas de esas plataformas que obviamente no encontrará en MSVC. gcc (bueno, la cadena de herramientas gcc) también compila una gran cantidad de idiomas más allá de C y C++; Recientemente lo usé para Objective-C, por ejemplo.

EDIT: Estoy con Dean al cuestionar la validez de su pregunta. Sí, MSVC (cl) tiene opciones para el equivalente de muchas de las opciones de gcc, pero no, el número de opciones realmente no significa mucho.

En resumen: a menos que esté haciendo algo muy especial, encontrará MSVC fácilmente "lo suficientemente potente" en la plataforma de Windows que probablemente no le faltarán opciones de gcc.

+1

Solo estoy considerando C/C++ aquí. Incluso si elimino otros idiomas de la imagen, faltan muchas cosas más, como las diferentes versiones de los estándares C/C++. Acerca de "cualquier opción que no esté presente en ninguno de los dos es una opción para algo que no vale la pena hacer en primer lugar". ¿Las opciones que señalé en mi pregunta no son útiles? ¿No valen la pena? – claws

+0

@claws: las opciones que indicó en su pregunta * son * útiles, y otras respuestas han señalado los equivalentes cl.exe. Y las diferentes versiones de compatibilidad con los estándares C/C++ serían agradables.Pero vamos, bastantes de los knobs y silbatos de gcc son defectuosos. ¿Cuándo fue la última vez que jugaste con '-fschedule-insns2'? –

10

Para el equivalente de -E, cl.exe tiene /P (no se "detiene después de la etapa de preprocesamiento" pero emite la salida del preprocesador a un archivo, que es en gran medida la misma cosa).

Para -S, que es un poco más oscuro, ya que la "compilación" y "montaje" pasos ocurren en varios lugares dependiendo de lo otra opciones que ha especificado (por ejemplo, si usted tiene la optimización de todo el programa se activa, entonces el código de máquina no se genera hasta la etapa de enlace).

Para -v, Visual C++ no es lo mismo que GCC. Ejecuta todas las etapas de compilación directamente en cl.exe (y link.exe) por lo que no hay "comandos ejecutados" para mostrar. De forma similar para -save-temps: como todo sucede dentro de cl.exe y link.exe directamente, los únicos archivos "temporales" son los archivos .obj que produce cl.exe y que siempre se guardan de todos modos.

Sin embargo, al final del día, GCC es un proyecto de código abierto. Eso significa que cualquiera que tenga ganas de rascarse puede agregar cualquier opción de línea de comandos que quiera con relativamente poca resistencia. Para Visual C++, un producto comercial de código cerrado, cada opción debe tener un caso de negocios, reuniones de diseño, planes de prueba, etc. Every new feature starts with minus 100 points.

+1

+1: ha encontrado esto útil. – claws

+3

Dudo que todos los que tienen un poco de arañazo puedan agregar una opción de línea de comando; sigue siendo un proyecto de software estable con mantenedores que necesitan evitar una complejidad innecesaria en un código ya complicado. Por supuesto, dado que se pueden agregar nuevas opciones * localmente, es más probable que se lleven a cabo experimentos extraños que resulten útiles, y eso reduce la barrera a la inclusión, por supuesto. –

+1

@Eamon: eso es probablemente cierto. Mi punto era principalmente que sería mucho más difícil para Microsoft agregar un conmutador de línea de comandos para algo que solo una pequeña fracción de la base de usuarios encontraría útil, mientras que para GCC no es tanto. –

Cuestiones relacionadas