我有一个包含QT4 GUI的ROS包。我的代码在文件夹中
Project_name/src/test/*.cpp
我的包括在
Project_name/include/test/*.h
必须创建一些qt4 moc,因为某些头文件在其类中包含Q_OBJECT。
我试过了
set(CMAKE_AUTOMOC ON)
在cmake文件中,但因为它似乎不搜索/ include / test /文件夹。 AUTOMOC指出,无论是搜索源文件中的moc_ * *。cpp文件,还是检查Q_OBJECT的头文件。
我还尝试在源文件中包含moc_***.cpp
(例如/src/test/a.cpp
)。因此,它搜索了a.h
但未在include/test/a.h
中找到它。
我必须注意,如果我从类中删除Q_OBJECT,则编译成功,因为include /文件夹是这样添加的:
include_directories( include
${catkin_INCLUDE_DIRS}
)
最后我尝试使用QT4_WRAP_CPP但由于某种原因它也找不到mocs并且链接失败(尽管在cmake文件中具有相同参数的另一个项目中起作用:/)
修改: 找到了解决方案。在cpp文件中添加:
#include "../../include/test/moc_a.cpp"
并在include / test中找到了.h。
虽然有些东西告诉我这不是正确的方法:P
答案 0 :(得分:7)
#include "../../include/test/moc_a.cpp"
可以正常工作,但对于有时可以作为大型项目中的静态库而有时自己构建的库来说效果不佳。问题是 include 目录可以在不合适的位置创建,这会污染代码,导致VCS出现问题。
qt_wrap_cpp最适合我。它支持qt4和qt5,不需要在cpp文件中包含moc。语法:
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})
当然,只有包含Q_OBJECT
宏且与相应来源不在同一目录中的标头必须传递给qt_wrap_cpp
。