llvm-c/Types.h: нет такого файла или каталога

#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