Как объявить stdin
, stout
и stderr
(желательно версии C) в LLVM? Я пытаюсь использовать некоторые функции stdio на игрушечном языке, который я создаю. Одной из таких функций была fgets
:LLVM stdin/stdout/stderr
char * fgets (char * str, int num, FILE * stream);
Для того, чтобы использовать, что мне нужно stdin
. Поэтому я написал код LLVM API для генерации определения FILE, который я нашел, и объявил stdin
внешним глобальным. Сгенерированный код это:
%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*
Однако, когда я побежал получившийся модуль, он дал мне эту ошибку:
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
Судя по всему, что я написал не работал. Итак, мой вопрос заключается в том, что мне нужно написать в LLVM API для объявления stdin
, stout
и stderr
для таких функций, как fgets
, в чем-то вроде компилятора игрушечного языка?
Вы можете написать вспомогательные функции в C, которые возвратят stdin/stdout/stderr и свяжут их с вашей программой. –
Я попробую, хотя я бы предпочел просто использовать то, что дает нам LLVM API, если можно. – tophat