QT5 и Antlr4.8 не компилируются с Cmake и QT Creator - PullRequest
1 голос
/ 19 апреля 2020

Как и в предыдущем примере, я пытаюсь скомпилировать проект QT5 внутри QT Creator с помощью cmake и хочу добавить пакет antlr.

Информация: Qt 5.12.8, Antlr 4.8, Компиляторы пробовали: mingw gcc | g ++, msv c 2015,2017 Система: Windows / Linux оба не работают

Для включения Antlr 4.8 я использую прилагаемый пакет CPP для сборки Antlr из источника

Это проект, над которым я работаю. https://github.com/MrDiver/ArmSimulator/tree/ArmParser/src/asmeditor/AsmEditor

я включаю antlr4 со следующим https://github.com/MrDiver/ArmSimulator/blob/ArmParser/src/asmeditor/AsmEditor/CMakeLists.txt#L14 -L21

и обычно он прекрасно работает, когда я что-то скомпилирую с ним , Но на этот раз, когда я пытаюсь включить заголовочные файлы для antlr, я получаю это сообщение об ошибке

FAILED: CMakeFiles/AsmEditor.dir/managers/processormanager.cpp.obj 
H:\Programme\QT\Tools\mingw730_64\bin\g++.exe  -DANTLR4CPP_STATIC -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_WIDGETS_LIB -I. -IH:/MyStuff/PrivateProjects/CPPProjects/ArmSimulator/src/asmeditor/AsmEditor -IAsmEditor_autogen/include -Iantlr4_runtime/src/antlr4_runtime/runtime/Cpp/runtime/src -IH:/MyStuff/PrivateProjects/CPPProjects/ArmSimulator/src/asmeditor/AsmEditor/armparser/assembler -IH:/MyStuff/PrivateProjects/CPPProjects/ArmSimulator/src/asmeditor/AsmEditor/armparser/walker -IH:/MyStuff/PrivateProjects/CPPProjects/ArmSimulator/src/asmeditor/AsmEditor/codearea -IH:/MyStuff/PrivateProjects/CPPProjects/ArmSimulator/src/asmeditor/AsmEditor/managers -IH:/MyStuff/PrivateProjects/CPPProjects/ArmSimulator/src/asmeditor/AsmEditor/armparser -isystem H:/Programme/QT/5.12.8/mingw73_64/include -isystem H:/Programme/QT/5.12.8/mingw73_64/include/QtWidgets -isystem H:/Programme/QT/5.12.8/mingw73_64/include/QtGui -isystem H:/Programme/QT/5.12.8/mingw73_64/include/QtANGLE -isystem H:/Programme/QT/5.12.8/mingw73_64/include/QtCore -isystem H:/Programme/QT/5.12.8/mingw73_64/./mkspecs/win32-g++ -O3 -DNDEBUG   -std=gnu++11 -MD -MT CMakeFiles/AsmEditor.dir/managers/processormanager.cpp.obj -MF CMakeFiles\AsmEditor.dir\managers\processormanager.cpp.obj.d -o CMakeFiles/AsmEditor.dir/managers/processormanager.cpp.obj -c H:/MyStuff/PrivateProjects/CPPProjects/ArmSimulator/src/asmeditor/AsmEditor/managers/processormanager.cpp
In file included from antlr4_runtime/src/antlr4_runtime/runtime/Cpp/runtime/src/antlr4-runtime.h:31:0,
                 from H:/MyStuff/PrivateProjects/CPPProjects/ArmSimulator/src/asmeditor/AsmEditor/managers/processormanager.cpp:2:
antlr4_runtime/src/antlr4_runtime/runtime/Cpp/runtime/src/Lexer.h:116:46: error: invalid declarator before 'newToken'
     virtual void emit(std::unique_ptr<Token> newToken);
                                              ^~~~~~~~
antlr4_runtime/src/antlr4_runtime/runtime/Cpp/runtime/src/Lexer.h:116:46: error: expected ')' before 'newToken'
antlr4_runtime/src/antlr4_runtime/runtime/Cpp/runtime/src/Lexer.h:123:25: error: expected unqualified-id before ')' token
     virtual Token* emit();
                         ^
[30/31 0.6/sec] Building CXX object CMakeFiles/AsmEditor.dir/armparser/assembler/ARMParser.cpp.obj
ninja: build stopped: subcommand failed.
18:59:55: The process "C:\msys64\mingw64\bin\cmake.exe" exited with code 1.
Error while building/deploying project AsmEditor (kit: Desktop Qt 5.12.8 MinGW 64-bit)
When executing step "CMake Build"

Файл интереса: https://github.com/MrDiver/ArmSimulator/blob/ArmParser/src/asmeditor/AsmEditor/managers/processormanager.cpp

Похоже он не может найти std::unique_ptr<Token>, но я не могу многое изменить по этому поводу, потому что это источники antlr, и они на самом деле работают.

Так что я больше не знаю, где искать проблему , Сама библиотека прекрасно компилируется, если я выберу ее в качестве цели в настройках.

Что я пробовал:

  • Скомпилировать библиотеку antlr снаружи и просто связать ее в файле cmake.
  • Изменение файла Lexer.h с помощью #include <memory>.
  • Компиляция проекта QT без QT Creator (Это приводит к большему количеству ошибок, потому что я не могу заставить работать линковку для QT)
  • Компиляция каждого файла, относящегося к Antlr, вне проекта (прекрасно работает без QT, но не совсем то, что мне нужно)
  • Использование разных компиляторов и разных систем.
  • Поиск проблемы с moc но это, похоже, не влияет на это. Но я сомневаюсь, что я выглядел достаточно усердно на мо c для этого.

И я довольно новичок в QT, поэтому я не знаю всего, что делает Qt Creator за кулисами. Кажется слишком много, если я не могу скомпилировать его с простым cmake из коробки.

Спасибо за помощь заранее.

1 Ответ

1 голос
/ 19 апреля 2020

Проблема в том, что в Antlr есть такие методы, как "emit", которые конфликтуют с зарезервированным словом Qt "emit". Решение состоит в том, чтобы отключить флаг «no_keywords» (в qmake add CONFIG += no_keywords и в CMake add add_definitions(-DQT_NO_KEYWORDS)), как указано the docs . Затем вы должны сделать следующие преобразования:

emit to Q_EMIT
slot to Q_SLOT
slots to Q_SLOTS
signal to Q_SIGNAL
signals to Q_SIGNALS
...