2013-11-06 3 views
5

У меня есть пакет ROS, который включает в себя графические интерфейсы QT4. Мой код находится в папке Project_name/src/test/*.cpp и мой включает в Project_name/include/test/*.hДобавить включить каталоги в AUTOMOC

должны быть созданы некоторые qt4 MOCS как некоторые заголовочные файлы содержат Q_OBJECT в своих классах.

Я пробовал set(CMAKE_AUTOMOC ON) в файле cmake, но, как кажется, он не ищет папку/include/test /. AUTOMOC утверждает, что работает либо bu, ища исходные файлы для файлов moc_ * * .cpp, либо изучая файлы заголовков для Q_OBJECT.

Я также попытался включить moc_***.cpp в исходный файл (например, /src/test/a.cpp). Так он искал a.h, но не смог найти его в include/test/a.h.

я должен отметить, что если я удалить Q_OBJECT из классов компиляция прошла успешно, как включить/папка добавляется так: include_directories(include ${catkin_INCLUDE_DIRS} )

Наконец я попытался использовать QT4_WRAP_CPP, но по какой-то причине он не мог «т найти МОС, а также и ссылку не удалось (хотя в другом проекте с теми же параметрами в файле Cmake работает: /)

Edit: Найдено решение. В добавил в файле CPP:

#include "../../include/test/moc_a.cpp"

и нашел .h в включают/тест.

Хотя что-то мне подсказывает, что это не правильный путь: P

ответ

6

#include "../../include/test/moc_a.cpp" в CPP файл работает, но не очень хорошо для библиотек, которые могут быть построены иногда как статические библиотеки в рамках более крупного проекта, а иногда и сами по себе. Проблема в том, что включает в себя каталог, который может быть создан в неприемлемом месте, которое загрязняет код, вызывает проблемы с VCS.

qt_wrap_cpp работает лучше всего для меня. Он поддерживает как qt4, так и qt5, не требует включения moc в файл cpp. Синтаксис:

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.

Смежные вопросы