2014-12-12 15 views
6

C'è un modo (ad es. Costanti definite) per accedere ai flag di compilazione con cui è stato eseguito il compilatore all'interno del codice che viene compilato.g ++: C'è un modo per accedere ai flag di compilazione all'interno del codice che viene compilato?

Ad esempio, desidero un programma che scriva le flag con cui è stato compilato.

int main(){ 
    std::cout << COMPILE_FLAGS << std::endl; 
} 

Esistono tali costanti per gcc/g ++? O ancora meglio: ci sono costanti che sono definite sia in gcc che in clang?

Sono particolarmente interessato a esaminare il livello di ottimizzazione e il valore del flag -march. Quindi, se non ci sono costanti che mostrano tutti i flag, ci sono almeno quelli che visualizzano questi valori?

+0

Se non altro, si dovrebbe essere in grado di hackerare qualcosa insieme usando un makefile che imposta simultaneamente un flag di ottimizzazione e scrive una costante in un file di intestazione. – Degustaf

+0

Vorrei provare a cercare nelle informazioni di debug memorizzate con il codice, SE è compilato con tali informazioni. In generale, direi che non c'è modo, perché compiliamo il codice macchina, e nella maggior parte dei casi questa informazione sarebbe del tutto inutile in fase di esecuzione. Voglio dire che la maggior parte delle bandiere influenza quali istruzioni macchina sono state scelte e quali ottimizzazioni possono essere fatte, quindi potresti essere in grado di dedurre alcuni dei flag dal codice macchina stesso. – midor

risposta

1

Il comando seguente codice stampa tutte le macro predefinite:

g++ -dM -E - < /dev/null 

Questo funziona sia con gcc e g ++. Puoi controllare te stesso - sfortunatamente, non esiste una macro, che dia un facile accesso alla riga di comando di gcc/g ++.

Fortunatamente, la maggior parte dei flag -m ... produce macro precompilatore adeguate da definire. Ad esempio, -m64 definisce __x86_64 e -m32 definisce __code_model_32__. O per -march: -march = core-avx2 risultati in #define __core_avx2__ 1.

Basta aggiungere l'opzione, che è necessario controllare, nella riga di comando sopra, e controllare il risultato per la nuova macro definita.

0

Se si è in grado di modificare i flag di compilazione o lo script che genera il comando di compilazione, si potrebbe aggiungere un -DCOMPILE_FLAGS = < le bandiere a cui sei interessato> per la build per creare in realtà che costante.

Dal GCC manual:

-D name = definizione Il contenuto di definizione sono in formato token e trattati come se fossero apparsi durante la fase di traduzione di tre in un ‘#define’ direttiva . In particolare, la definizione verrà troncata da caratteri newline incorporati.

Problemi correlati