¿Cómo se declaran stdin
, stout
y stderr
(preferiblemente las versiones C) en LLVM? Estoy intentando usar algunas funciones de stdio en un lenguaje de juguete que estoy creando. Una de esas funciones fue fgets
:LLVM stdin/stdout/stderr
char * fgets (char * str, int num, FILE * stream);
Con el fin de utilizar lo que necesitaba stdin
. Así que escribí un código LLVM API para generar la definición de FILE que encontré, y declaró stdin
un global externo. El código generado esto:
%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*
Sin embargo, cuando me encontré con el módulo resultante, que me dio este error:
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
Al parecer, lo que escribí no funcionaba. Entonces mi pregunta es ¿qué tengo que escribir en la API de LLVM para declarar stdin
, stout
y stderr
para funciones como fgets
en algo así como un compilador de lenguaje de juguete?
Puede escribir funciones auxiliares en C que devolverán stdin/stdout/stderr y las vinculará con su programa. –
Lo intentaré, aunque preferiría simplemente usar lo que la API LLVM nos da para hacerlo, si puedo. – tophat