2013-10-11 3 views
5

Я пытаюсь определить макрос препроцессора в Scons для построения более крупного проекта C/C++.Определение макросов препроцессора C++ со SCons

Одна из библиотек, которые я использую, определяется ALIGN. Более конкретно, если я добавлю в файл заголовка указанной библиотеки

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

в файл заголовка указанной библиотеки. Тем не менее, я должен уметь указывать это во время сборки, так как именно библиотека использует ее. Я знаю, что в CMake, я смог бы определить макрос, используя что-то вроде

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

Определение констант в Scons как этот

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

работает отлично, но definine макрос таким образом не работает. Что дает?

Edit: Исправлена ​​опечатка

+0

как вы пытались создать макрос? – Brady

+0

Я пропустил знак равенства. Добавив его, я получил еще одну ошибку (в сценарии оболочки), но это было легко разрешено путем добавления пробелов по обе стороны от символа. Спасибо за пример! – TSeabrook43

ответ

6

Я был в состоянии сделать это на Linux с г ++ следующим образом:

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; 
} 

Компиляция

$ 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. 

Execution

./main 
Max is 5 
Смежные вопросы