Итак, у меня есть две копии LLVM на моем компьютере: одна установлена с помощью apt, а другая построена с поддержкой отладки из репозитория git. Я пытаюсь создать проход вне исходного дерева, как описано здесь и здесь, и запустить его с отладочной сборкой opt. Однако, несмотря на то, что я писал свои CMakeLists, как описано в этих инструкциях, я вижу, что компилятор все еще использует заголовки из неотладочной версии (той, которая установлена через apt); это проблема, потому что в неотладочной версии не включены проверки на нарушение ABI (см. здесь), в то время как в отладочной версии есть, и поэтому опция debug-build отказывается загружать мой проход.
Я могу сказать, что компилятор использует неправильные заголовки, потому что я попытался вручную определить LLVM_ENABLE_ABI_BREAKING_CHECKS в своем собственном коде и получил следующее предупреждение от компилятора:
In file included from /path/to/Pass.cpp:1:
/path/to/Pass.h:10: warning: "LLVM_ENABLE_ABI_BREAKING_CHECKS" redefined
10 | #define LLVM_ENABLE_ABI_BREAKING_CHECKS 1
|
In file included from /usr/include/llvm/ADT/STLExtras.h:22,
<etc>,
from /path/to/Pass.cpp:1:
/usr/include/llvm/Config/abi-breaking.h:16: note: this is the location of the previous definition
16 | #define LLVM_ENABLE_ABI_BREAKING_CHECKS 0
Как видите, для заголовков LLVM используются пути в / usr / include, а не пути из дерева Git. И, несмотря на то, что я переопределил макрос, он все равно не построил мой проход с правильной конфигурацией (неправильный символ присутствует в скомпилированной библиотеке). Как указать компилятору на правильные заголовки (желательно с помощью CMake)?
Обратите внимание, что это не вызвано конфликтом RTTI, который может вызывать аналогичные ошибки неопределенного символа при выполнении проходов с опцией. Я создаю свой пропуск с -fno-rtti.





Очевидно, что файл
CMakeLists.txtвашего пропуска получил неверный LLVM. Помогите ему, установив соответствующие переменные CMake.