Я написал скрипт для анализа файлов C/C++ с использованием библиотеки libclang
.
Файл, который я пытался разобрать: osf_sys.c. Программа печатает каждую функцию/переменную и т.д. в файле. Пример вывода:
...
CURSORKIND: 6; __user at line: 469
CURSORKIND: 43; struct proplistname_args at line: 469
CURSORKIND: 6; nbytes at line: 470
...
Итак, я запускаю свой скрипт ./script osf_sys.c
, и синтаксический анализ в основном работает. Однако я заметил, что некоторые части osf_sys.c
не печатались (отсутствующие переменные и еще много чего), и я подозреваю, что это было связано с файлами заголовков (которые находились в отдельном каталоге). Я добавил фрагмент кода, чтобы помочь с отладкой/печатью сообщений об ошибках, показанных ниже.
Попытка 1
После создания сценария с помощью CMake
я приступаю к его запуску. Это ошибка, которая печатается:
/Linux_Kernel/linux/arch/alpha/kernel/osf_sys.c:13:10:
fatal error: 'linux/errno.h' file not found
Похоже, у него возникли проблемы с поиском файлов заголовков этого osf_sys.c
. Поэтому я добавил это в CMakeLists.txt
(что, вероятно, неверно, поскольку проблема, похоже, не в компиляции моей программы, а в том, как libclang находит вещи):
-I/Linux_Kernel/linux/include
Обратите внимание, что полный путь к errno .h равно /Linux_Kernel/linux/include/linux/errno.h
Попытка 2
Я решил перетащить всю папку include/
в тот же каталог, в котором находится osf_sys.c
.
Теперь, запустив его, я получаю новую распечатку ошибки:
/Linux_Kernel/linux/arch/alpha/kernel/osf_sys.c:13:10: error:
'linux/errno.h' file not found with <angled> include; use "quotes" instead
с последующим:
/Linux_Kernel/linux/arch/alpha/kernel/linux/errno.h:4:10:
fatal error: 'asm/errno.h' file not found
Ладно, теперь вроде что-то читает. Разумеется, речь идет о строке #include <linux/errno.h>
из файла osf_sys.c
. Второе сообщение об ошибке появляется, предположительно, из-за того, что я не перетащил папку asm/
в тот же рабочий каталог, что и osf_sys.c
.
Попытка 3
Итак, как и просили, я вручную редактирую osf_sys.c
, чтобы изменить #include <linux/errno.h>
на #include "linux.errno.h"
.
На этот раз у меня осталось следующее сообщение об ошибке:
/Linux_Kernel/linux/arch/alpha/kernel/linux/errno.h:4:10:
fatal error: 'asm/errno.h' file not found
Попытка 4
Передача -I/Linux_Kernel/linux/include
в качестве аргумента скрипту. Сценарий использует следующие параметры для CXTranslationUnit
:
CXTranslationUnit translationUnit = clang_parseTranslationUnit(index, nullptr, argv, argc, 0, 0, CXTranslationUnit_KeepGoing);
Это дает другие виды сообщений об ошибках:
warning: 'linker' input unused [-Wunused-command-line-argument]
/Linux_Kernel/linux/arch/alpha/kernel/linux/errno.h:4:10: error: 'asm/errno.h' file not found
/Linux_Kernel/linux/include/linux/types.h:4:10: error: 'asm/types.h' file not found
...
Что осталось сделать?
У меня мало намерений редактировать все операторы #include
(в каждом отдельном файле ядра Linux), чтобы использовать двойные кавычки И перетаскивать папку include/
в каждый отдельный каталог с файлом .c
.
Был бы признателен за совет о том, как заставить libclang
искать каталог файлов include/
, который я указываю.
Любые предложения/альтернативы относительно того, как я могу решить эту проблему?
asm/errno.h
- person Increasingly Idiotic   schedule 23.04.2018