【问题标题】:Add include directories to AUTOMOC将包含目录添加到 AUTOMOC
【发布时间】:2013-11-18 05:20:43
【问题描述】:

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

某些 qt4 mocs 必须创建,因为某些头文件在其类中包含 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

【问题讨论】:

    标签: c++ qt4 makefile cmake ros


    【解决方案1】:

    #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})
    

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

    【讨论】:

      猜你喜欢
      • 2013-07-04
      • 1970-01-01
      • 2015-12-21
      • 1970-01-01
      • 2011-05-20
      • 2015-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多