Frage Fügen Sie Include-Verzeichnisse zu AUTOMOC hinzu


Ich habe ein ROS-Paket, das QT4 GUIs enthält. Mein Code befindet sich im Ordner Project_name/src/test/*.cpp  und mein beinhaltet in Project_name/include/test/*.h

Einige qt4-Mocs müssen erstellt werden, da einige Header-Dateien Q_OBJECT in ihren Klassen enthalten.

Ich habe es versucht set(CMAKE_AUTOMOC ON) in der cmake-Datei, aber anscheinend sucht es nicht im Ordner / include / test /. AUTOMOC gibt an, dass entweder die Quelldateien nach moc_ durchsuchen** .cpp-Dateien oder durch Untersuchung der Header-Dateien für Q_OBJECT.

Ich habe auch versucht, ein moc_***.cpp in einer Quelldatei (zum Beispiel /src/test/a.cpp). So hat es gesucht a.h aber konnte es nicht finden include/test/a.h.

Ich muss beachten, dass, wenn ich das Q_OBJECT aus den Klassen entferne, die Kompilierung erfolgreich ist, da der include / Ordner wie folgt hinzugefügt wird: include_directories( include ${catkin_INCLUDE_DIRS} )

Schließlich habe ich versucht, QT4_WRAP_CPP zu verwenden, aber aus irgendeinem Grund konnte es die Mocs nicht finden und die Verbindung ist fehlgeschlagen (obwohl in einem anderen Projekt mit den gleichen Parametern in der cmake-Datei funktioniert: /)

Bearbeiten:


6
2017-11-06 19:31


Ursprung


Antworten:


#include "../../include/test/moc_a.cpp" in cpp-Datei funktioniert aber nicht gut für Bibliotheken, die manchmal als statische Bibliotheken in größeren Projekten und manchmal auch selbst erstellt werden können. Das Problem ist, dass einschließen Verzeichnis kann an einem unpassenden Ort erstellt werden, der Code verschmutzt, Probleme mit VCS verursacht.

qt_wrap_cpp funktioniert am besten für mich. Es unterstützt sowohl qt4 als auch qt5, benötigt keine moc in der cpp-Datei. Die Syntax:

include_directories(${CMAKE_CURRENT_BINARY_DIR}) # including binary dir is
# necessary only if there are classes with Q_OBJECT macro declared in cpp
# files (these cpp files should also contain `# include "x.moc"` at the end).
set(CMAKE_AUTOMOC ON)
include_directories(${Include_Directories})
set(Sources ${Sources_Path}/a.cpp ${Sources_Path}/b.cpp
     ... ${Sources_Path_z}/z.cpp)
qt_wrap_cpp(${Target_Name} Sources ${Headers_Path}/header1.hpp
            ${Headers_Path_2}/header2.hpp ... ${Headers_Path_N}/headerN.hpp)
add_library(${Target_Name} STATIC ${Sources})
# OR add_executable(${Target_Name} ${Sources})

Natürlich nur die Header, die enthalten Q_OBJECT Makro und befinden sich nicht im selben Verzeichnis wie entsprechende Quellen übergeben werden müssen qt_wrap_cpp.


7
2018-06-01 10:11