#compiler-construction #llvm #abstract-syntax-tree #llvm-ir #llvm-c -api
#компилятор-конструкция #llvm #абстрактное синтаксическое дерево #llvm-ir #llvm-c -api
Вопрос:
Я пишу игрушечный компилятор для подмножества C. Я использую flex, bison и LLVM для ASTs. Для создания ASTS я написал заголовочный файл, который содержит определения узлов и сведения о наследовании. Заголовок выглядит следующим образом:
#include <iostream>
#include <vector>
#include <llvm-6.0/llvm/IR/Value.h>
....
После компиляции моих файлов с помощью следующей последовательности команд:
bison -d parser.y -o parser.cpp
flex -o tokens.cpp tokens.l
g -o parser parser.cpp tokens.cpp main.cpp
Затем компилятор выдает следующие ошибки:
In file included from node.h:3:0,
from parser.y:2:
/usr/include/llvm-6.0/llvm/IR/Value.h:17:10: fatal error: llvm-c/Types.h: No such file or directory
#include "llvm-c/Types.h"
^~~~~~~~~~~~~~~~
compilation terminated.
In file included from node.h:3:0,
from tokens.l:3:
/usr/include/llvm-6.0/llvm/IR/Value.h:17:10: fatal error: llvm-c/Types.h: No such file or directory
#include "llvm-c/Types.h"
^~~~~~~~~~~~~~~~
compilation terminated.
In file included from node.h:3:0,
from main.cpp:2:
/usr/include/llvm-6.0/llvm/IR/Value.h:17:10: fatal error: llvm-c/Types.h: No such file or directory
#include "llvm-c/Types.h"
^~~~~~~~~~~~~~~~
compilation terminated.
Я попытался выполнить поиск в каталоге «include», но файл «Types.h» находится где-то в другом месте, а не в каталоге «llvm / IR». Должен ли указывать какой-либо путь во время компиляции? Любая помощь приветствуется!
Комментарии:
1. Я вижу, что вы используете llvm-c API, даже если вы используете файлы C . Это звучит странно. Возможно, вы сможете это сделать, но вы будете уникальны. Большинство пользователей C используют собственный API C , а не оболочку C. Вы могли бы рассмотреть возможность устранения вместо решения этой проблемы путем переключения на C API.
2. Я использую C API. Ошибка находится в файле библиотеки «llvm-6.0/llvm/IR/Value.h», в котором используется «llvm-c / Types.h».
3. Вы установили LLVM или создали из исходного кода?
Ответ №1:
Я знаю, что этот вопрос довольно старый, но я просто столкнулся с той же проблемой и не смог найти ответа, поэтому мне пришлось разобраться. Добавление решения здесь может помочь другим.
Точно так же, как вы должны были добавить префикс «llvm-6.0» для включения Value.h, вам нужно будет сделать то же самое для llvm-c. Не рекомендуется редактировать системные включаемые файлы, поэтому я сделал это в вызове g (я использую llvm 10, но должно быть то же самое для других версий):
g -I/usr/include/llvm-10 -I/usr/include/llvm-c-10 -o parser parser.cpp tokens.cpp main.cpp