El binario gcc
impulsa el proceso de compilación invocando una serie de otros programas en secuencia para realizar realmente las diversas etapas del trabajo (compilación, ensamblaje, vinculación).
Cuando dicen:
gcc -x assembler-with-cpp -D MACRO_FROM_CMDLINE=1 ...
le está pidiendo que se ejecute la fuente a través del preprocesador C y, a continuación, ejecute el resultado a través del ensamblador.
El paso preprocesador C se enciende:
.ifdef MACRO_FROM_CMDLINE
en:
.ifdef 1
antes de pasarlo al ensamblador, que entonces no puede tener sentido de él. Es por eso que obtiene el error de "identificador inválido". También explica por qué el preprocesador C #ifdef
soluciona el problema.
--defsym
no funciona porque es una opción para el ensamblador, no el programa gcc
conductor. (El conductor gcc
hace entender y pasar a través de algunos opciones a algunos de los programas que invoca, pero no todos.)
Usted puede, sin embargo, pasar opciones arbitrarias hasta el ensamblador usando el
-Wa,option[,option...]
sintaxis, que cuenta la gcc
conductor para pasar los opción (s) a través de al ensamblador (como una lista de opciones separados por un espacio).
Por ejemplo:
gcc -x assembler-with-cpp -Wa,--defsym,MACRO_FROM_CMDLINE=1 ...
añade
--defsym MACRO_FROM_CMDLINE=1
a la lista de opciones que se pasan a as
cuando gcc
lo invoca, y eso es cómo hacer su trabajo .ifdef
original ejemplo.
Se puede ver los programas individuales invocados por gcc
, y las opciones que en realidad pasa a ellos, añadiendo la opción -v
.
En este caso, debería ver algo que se llama cc1
(el actual GCC compilador de C binario) invoca con el indicador -E
(sólo preproceso) para preprocesar la entrada en un archivo temporal, y luego as
invocado en el archivo temporal para montar eso.
Confirmo que las opciones -Wa, descritas por Mat arriba funcionan bastante bien. – Raj