2013-10-11 20 views
5

Sto provando a definire una macro di preprocessore all'interno di Scons per creare un progetto C/C++ più grande.Definizione di macro preprocessore C++ con SCons

Una delle librerie che sto utilizzando necessita di ALIGN definito. Per essere più specifico, se aggiungo

#define ALIGN(x) __attribute((aligned(x))) 

al file di intestazione di detta libreria, esso compila bene. Tuttavia, dovrei essere in grado di specificarlo al momento della compilazione, poiché questo è il modo in cui la biblioteca intende essere utilizzata. So che nel CMake, sarei in grado di definire la macro usando qualcosa come

SET(ALIGN_DECL "__attribute__((aligned(x)))") 

Definizione costanti in Scons come questo

myEnv.Append(CPPDEFINES = ['IAMADEFINEDCONSTANT']) 

funziona bene, ma definine un macro in questo modo non funziona Cosa dà?

Edit: errore di battitura fisso

+0

come ha fatto si tenta di creare la macro? – Brady

+0

Stavo omettendo il segno di uguale. Aggiungendomi ho ottenuto un altro errore (in uno script di shell), ma questo è stato risolto facilmente aggiungendo spazi bianchi su entrambi i lati del personaggio. Grazie per l'esempio! – TSeabrook43

risposta

6

sono stato in grado di farlo su Linux con g ++ come segue:

SConscript

env = Environment() 
env.Append(CPPDEFINES=['MAX(x,y)=(x>y ? x:y)']) 
env.Program(target = 'main', source = 'main.cc') 

main.cc

#include <iostream> 

using namespace std; 

int main(int argc, char **argv) 
{ 
    int a = 3; 
    int b = 5; 

    // MAX() will be defined at compile time 
    cout << "Max is " << MAX(a, b) << endl; 
} 

Compilation

$ scons 
scons: Reading SConscript files ... 
scons: done reading SConscript files. 
scons: Building targets ... 
g++ -o main.o -c "-DMAX(x,y)=(x>y ? x:y)" main.cc 
g++ -o main main.o 
scons: done building targets. 

Esecuzione

./main 
Max is 5