6

我有一个包含 QT4 GUI 的 ROS 包。我的代码在文件夹中 Project_name/src/test/*.cpp ,我的包含在 Project_name/include/test/*.h

某些 qt4 mocs 必须创建,因为某些头文件在其类中包含 Q_OBJECT。

我在 cmake 文件中尝试了 set(CMAKE_AUTOMOC ON) ,但它似乎没有搜索 /include/test/ 文件夹。AUTOMOC 声明可以通过在源文件中搜索 moc_ * *.cpp 文件或通过检查 Q_OBJECT 的头文件来工作。

我还尝试将 a 包含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"

并在包含/测试中找到 .h。

虽然有些事情告诉我这不是正确的方法:P

4

1 回答 1

8

#include "../../include/test/moc_a.cpp"在 cpp 文件中工作,但对于有时可能作为较大项目中的静态库,有时由它们自己构建的库来说不是很好。问题是可以在不合适的位置创建包含目录,这会污染代码,导致 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.

于 2014-06-01T10:11:35.857 回答