将include目录添加到AUTOMOC

Man*_*ias 6 c++ makefile qt4 cmake ros

我有一个包含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

ved*_*edg 7

#include "../../include/test/moc_a.cpp"在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})
Run Code Online (Sandbox Code Playgroud)

当然,只有包含Q_OBJECT宏且与相应源不在同一目录中的标头必须传递给qt_wrap_cpp.