Come si dichiara stdin
, stout
e stderr
(preferibilmente le versioni C) in LLVM? Sto cercando di utilizzare alcune funzioni stdio in un linguaggio giocattolo che sto creando. Una tale funzione era fgets
:LLVM stdin/stdout/stderr
char * fgets (char * str, int num, FILE * stream);
Per poter utilizzare che avevo bisogno stdin
. Così ho scritto un codice API LLVM per generare la definizione di FILE trovata e dichiarato stdin
un globale esterno. Il codice generato questo:
%file = type { i32, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, %marker*, %file*, i32, i32, i64, i16, i8, [1 x i8], i8*, i64, i8*, i8*, i8*, i8*, i64, i32, [20 x i8] }
%marker = type { %marker*, %file*, i32 }
@stdin = external global %file*
Tuttavia, quando ho eseguito il modulo risultante, che mi ha dato questo errore:
Undefined symbols for architecture x86_64:
"_stdin", referenced from:
_main in cc9A5m3z.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
A quanto pare, quello che ho scritto non ha funzionato. Quindi la mia domanda è cosa devo scrivere nell'API LLVM per dichiarare stdin
, stout
e stderr
per funzioni come fgets
in qualcosa come un compilatore di linguaggio giocattolo?
È possibile scrivere funzioni di supporto in C che restituiscono stdin/stdout/stderr e collegarle al programma. –
Ci proverò, anche se preferirei usare solo ciò che l'API LLVM ci dà per farlo, se posso. – tophat