2013-09-23 7 views
14

staram się postępować zgodnie z samouczka w http://gnuu.org/2009/09/18/writing-your-own-toy-compiler/5/ (przy użyciu flex, bison i LLVM), ale podczas wpisywania linię#error "Must #define __STDC_LIMIT_MACROS przed #including support/DataTypes.h"

g ++ - o parser parser.cpp tokens.cpp main.cpp

otrzymuję następujące błędy:

In file included from /usr/local/include/llvm/Support/PointerLikeTypeTraits.h:18:0, 
       from /usr/local/include/llvm/ADT/PointerIntPair.h:17, 
       from /usr/local/include/llvm/IR/Use.h:28, 
       from /usr/local/include/llvm/IR/Value.h:17, 
       from node.h:3, 
       from parser.y:2: 
/usr/local/include/llvm/Support/DataTypes.h:48:3: erreur: #error "Must #define __STDC_LIMIT_MACROS before #including Support/DataTypes.h" 
/usr/local/include/llvm/Support/DataTypes.h:52:3: erreur: #error "Must #define __STDC_CONSTANT_MACROS before " "#including Support/DataTypes.h" 
parser.y: In function ‘void yyerror(const char*)’: 
parser.y:6:58: erreur: ‘printf’ was not declared in this scope 
In file included from /usr/local/include/llvm/Support/PointerLikeTypeTraits.h:18:0, 
       from /usr/local/include/llvm/ADT/PointerIntPair.h:17, 
       from /usr/local/include/llvm/IR/Use.h:28, 
       from /usr/local/include/llvm/IR/Value.h:17, 
       from node.h:3, 
       from tokens.l:3: 
/usr/local/include/llvm/Support/DataTypes.h:48:3: erreur: #error "Must #define __STDC_LIMIT_MACROS before #including Support/DataTypes.h" 
/usr/local/include/llvm/Support/DataTypes.h:52:3: erreur: #error "Must #define __STDC_CONSTANT_MACROS before " "#including Support/DataTypes.h" 
In file included from /usr/local/include/llvm/Support/PointerLikeTypeTraits.h:18:0, 
       from /usr/local/include/llvm/ADT/PointerIntPair.h:17, 
       from /usr/local/include/llvm/IR/Use.h:28, 
       from /usr/local/include/llvm/IR/Value.h:17, 
       from node.h:3, 
       from main.cpp:2: 
/usr/local/include/llvm/Support/DataTypes.h:48:3: erreur: #error "Must #define __STDC_LIMIT_MACROS before #including Support/DataTypes.h" 
/usr/local/include/llvm/Support/DataTypes.h:52:3: erreur: #error "Must #define __STDC_CONSTANT_MACROS before " "#including Support/DataTypes.h" 

Widziałem wiele stanowisk jak to w internecie, a najbardziej o f odpowiedzi obejmują definiowanie tych stałych w wierszu poleceń lub przy użyciu Makefile gcc.

Nie rozumiem, jak to zrobić, czy ktoś może mi pomóc?

Odpowiedz

13

Dołącz to do linii komend:

-D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS 

Aby uzyskać więcej informacji na temat opcji wiersza poleceń -D patrz gcc's documentation on preprocessor options.

+0

Świetnie, dziękuję! –

+0

@Oak Niestety nadal otrzymuję błędy po dodaniu tej opcji wiersza poleceń. Jakieś wskazówki? Jestem na OSX. – gideon

+0

@guideon przepraszam, nie. Lepiej zapytaj na [LLVM-dev] (http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev). – Oak

8

podstawie docs here, powinieneś być w stanie rozwiązać ten problem poprzez dodanie następujących opcji wiersza poleceń:

-D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS 

Następnie, nie mogą być pewne inne błędy:

parser. o: W funkcji NInteger::NInteger(long long)': parser.cpp:(.text._ZN8NIntegerC2Ex[_ZN8NIntegerC5Ex]+0x23): undefined reference to vtable dla NInteger ' parser.o: W funkcji NDouble::NDouble(double)': parser.cpp:(.text._ZN7NDoubleC2Ed[_ZN7NDoubleC5Ed]+0x24): undefined reference to vtable dla NDouble'

Spróbuj zastosować każdy kod codeGen w każdej klasie bez elementów llvm (tj. Zmień node.h). Wtedy będziesz mógł skompilować i uruchomić samouczek.

Nawiasem mówiąc, podczas kompilowania kodu, możesz użyć polecenia llvm-config get opcję zamiast korzystania -D opcję:

g++ -c `llvm-config --cppflags` xxxx.cpp