QT5 和 Antlr4.8 不能用 Cmake 和 QT Creator 编译
QT5 and Antlr4.8 not Compiling with Cmake and QT Creator
如上所示,我正在尝试使用 cmake 在 QT Creator 中编译 QT5 项目,并希望添加 antlr 包。
信息:Qt 5.12.8、Antlr 4.8、尝试过的编译器:mingw gcc|g++、msvc 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"
似乎找不到 std::unique_ptr<Token>
但我不能对此做太多更改,因为这些是 antlr 源并且它们确实有效。
所以我真的不知道去哪里寻找问题了。如果我在设置中选择它作为目标,库本身编译得很好。
我尝试了什么:
- 在外部编译antlr 库并在cmake 文件中链接它。
- 将
Lexer.h
文件更改为 #include <memory>
。
- 在没有 QT Creator 的情况下编译 QT 项目(导致更多错误,因为我无法获得 QT 工作的链接)
- 编译项目外的每个 Antlr 相关文件(在没有 QT 的情况下工作得很好,但不是我真正需要的)
- 使用不同的编译器和不同的系统。
- 正在搜索
moc
的问题,但似乎没有影响。但我怀疑我是否在 moc 上看得够仔细了。
我对 QT 还很陌生,所以我不知道 Qt Creator 在幕后做了什么。如果我不能用开箱即用的普通 cmake 编译它,这似乎太多了。
提前感谢您的帮助。
问题是 Antlr 有类似 "emit" 的方法与 Qt 保留字 "emit" 冲突。解决方案是禁用标志 "no_keywords"(在 qmake 中添加 CONFIG += no_keywords
,在 CMake 中添加 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
如上所示,我正在尝试使用 cmake 在 QT Creator 中编译 QT5 项目,并希望添加 antlr 包。
信息:Qt 5.12.8、Antlr 4.8、尝试过的编译器:mingw gcc|g++、msvc 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"
似乎找不到 std::unique_ptr<Token>
但我不能对此做太多更改,因为这些是 antlr 源并且它们确实有效。
所以我真的不知道去哪里寻找问题了。如果我在设置中选择它作为目标,库本身编译得很好。
我尝试了什么:
- 在外部编译antlr 库并在cmake 文件中链接它。
- 将
Lexer.h
文件更改为#include <memory>
。 - 在没有 QT Creator 的情况下编译 QT 项目(导致更多错误,因为我无法获得 QT 工作的链接)
- 编译项目外的每个 Antlr 相关文件(在没有 QT 的情况下工作得很好,但不是我真正需要的)
- 使用不同的编译器和不同的系统。
- 正在搜索
moc
的问题,但似乎没有影响。但我怀疑我是否在 moc 上看得够仔细了。
我对 QT 还很陌生,所以我不知道 Qt Creator 在幕后做了什么。如果我不能用开箱即用的普通 cmake 编译它,这似乎太多了。
提前感谢您的帮助。
问题是 Antlr 有类似 "emit" 的方法与 Qt 保留字 "emit" 冲突。解决方案是禁用标志 "no_keywords"(在 qmake 中添加 CONFIG += no_keywords
,在 CMake 中添加 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