Seperti di atas, saya mencoba mengkompilasi proyek QT5 di dalam QT Creator dengan cmake dan ingin menambahkan paket antlr.

Info: Qt 5.12.8, Antlr 4.8, Kompiler mencoba: mingw gcc|g++ , msvc 2015,2017 Sistem: Windows / Linux keduanya tidak berfungsi

Untuk memasukkan Antlr 4.8 saya menggunakan Paket CPP yang disediakan untuk membangun Antlr dari Sumber

Ini adalah proyek yang sedang saya kerjakan. https://github.com/MrDiver/ArmSimulator/tree/ArmParser/ src/asmeditor/AsmEditor

Saya menyertakan antlr4 dengan https: //github.com/MrDiver/ArmSimulator/blob/ArmParser/src/asmeditor/AsmEditor/CMakeLists.txt#L14-L21

Dan biasanya itu berfungsi dengan baik ketika saya mengkompilasi sesuatu dengannya. Tapi kali ini ketika saya mencoba memasukkan file header untuk antlr saya mendapatkan pesan kesalahan ini

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"

File Menarik: https://github. com/MrDiver/ArmSimulator/blob/ArmParser/src/asmeditor/AsmEditor/managers/processormanager.cpp

Sepertinya tidak dapat menemukan std::unique_ptr<Token> tetapi saya tidak dapat mengubah banyak tentang ini, karena ini adalah sumber semut dan mereka benar-benar berfungsi.

Jadi saya benar-benar tidak tahu lagi harus mencari masalah di mana. Perpustakaan itu sendiri mengkompilasi dengan baik jika saya memilihnya sebagai target dalam pengaturan.

Apa yang saya coba:

  • Mengkompilasi perpustakaan antlr di luar dan hanya menautkannya di file cmake.
  • Mengubah file Lexer.h dengan #include <memory>.
  • Mengkompilasi proyek QT tanpa QT Creator (Menghasilkan lebih banyak kesalahan karena saya tidak dapat membuat tautan agar QT berfungsi)
  • Mengkompilasi setiap file terkait Antlr di luar proyek (Bekerja dengan baik tanpa QT tetapi tidak benar-benar yang saya butuhkan)
  • Menggunakan kompiler yang berbeda dan Sistem yang berbeda.
  • Mencari masalah dengan moc tetapi tampaknya tidak memengaruhinya. Tapi saya ragu saya mencari cukup keras di moc untuk ini.

Dan saya cukup baru di QT jadi saya tidak tahu semua apa yang dilakukan Qt Creator di balik layar. Sepertinya terlalu banyak jika saya tidak dapat mengompilasinya dengan cmake biasa di luar kotak.

Terima kasih atas bantuannya sebelumnya.

2
MrDiver 19 April 2020, 20:12

1 menjawab

Jawaban Terbaik

Masalahnya adalah Antlr memiliki metode seperti "emit" yang bertentangan dengan kata "emit" yang dicadangkan Qt. Solusinya adalah dengan menonaktifkan flag "no_keywords" (di qmake add CONFIG += no_keywords, dan di CMake tambahkan add_definitions(-DQT_NO_KEYWORDS)) seperti yang ditunjukkan oleh dokumen. Maka Anda harus melakukan konversi berikut:

emit to Q_EMIT
slot to Q_SLOT
slots to Q_SLOTS
signal to Q_SIGNAL
signals to Q_SIGNALS
2
eyllanesc 19 April 2020, 18:47