2013-09-23 25 views
14

Ho cercato di seguire il tutorial a http://gnuu.org/2009/09/18/writing-your-own-toy-compiler/5/ (utilizzando flex, bisonti e LLVM), ma quando si digita la linea#error "Deve #define __STDC_LIMIT_MACROS prima #including Support/DataTypes.h"

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

ottengo i seguenti errori: un sacco

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" 

che ho visto di messaggi come questo su internet, e la maggior parte o Le risposte includono la definizione di queste costanti sulla riga di comando o utilizzando gcc Makefile.

Non capisco come farlo, qualcuno potrebbe darmi una mano?

risposta

13

aggiungere queste linee a riga di comando:

-D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS 

Per ulteriori informazioni su l'opzione della riga di comando -D, fare riferimento a gcc's documentation on preprocessor options.

+0

Grande, grazie! –

+0

@Oak Purtroppo ho ancora ricevuto gli errori dopo aver aggiunto questa opzione della riga di comando. Qualche indizio? Sono su OSX. – gideon

+0

@gideon scusa, no. È meglio chiedere su [LLVM-dev] (http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev). – Oak

8

Sulla base dei documenti here, si dovrebbe essere in grado di risolvere il problema aggiungendo le seguenti opzioni della riga di comando:

-D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS 

In seguito, ci potrebbero essere alcuni altri errori:

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

Provare ad implementare tutti i codici codiceGen in ogni classe senza llvm (ad esempio, modificare node.h). Quindi sarai in grado di compilare ed eseguire il tutorial.

A proposito, quando si compila il codice, si potrebbe desiderare di utilizzare llvm-config comando ottenere l'opzione invece di utilizzare l'opzione -D:

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