2012-10-18 1 views
2

В сущности, я хочу иметь файлы заголовков moc, которые не являются частью какой-либо цели в cmake, с дополнительной трудностью, которой я не знаю имена файлов этих заголовков.Использование automake от cmake на внешних файлах заголовков, не зная их имена

Фактический проект довольно сложный и является частью автоматизированной системы сборки. Ниже приведен простой пример. Рассмотрим проект структурированную, как это:

CMakeLists.txt
ЦСИ/Библиотека/source.cpp
ЦСИ/Библиотека/CMakeLists.txt
SRC/включать/some_header.hpp #, который включен в source.cpp


Содержание основного CMakeLists.txt:

cmake_mimimum_required(VERSION 2.8.6) 
project("automoctest") 
add_subdirectory(src/lib) 



Содержание SRC/Lib/C MakeLists.txt:

include_directories(${CMAKE_HOME_DIRECTORY}/src/include) 
find_package(Qt4 4.8 REQUIRED QtCore) 
include(UseQt4) 
include_directories(${CMAKE_CURRENT_BINARY_DIR}) 
add_library(foo SHARED source.cpp) 
target_link_libraries(foo ${QT_LIBRARIES}) 
set_target_properties(foo PROPERTIES AUTOMOC true) 



Inside source.cpp файл some_header.hpp включается так:

#include "some_header.hpp" 



Проблема:
Файл some_header.hpp включает в себя Q_OBJECT и имеет некоторые сигналы, поэтому moc должен работать своей магией. Но поскольку заголовок не находится внутри фактического проекта, заголовок не будет издеваться. Я даже не знаю имя файла some_header.hpp, поэтому я не могу добавить его специально для издевательства. Очевидно, что AUTOMOC не проверяет include_directories для макетируемых файлов, даже если исходный файл содержит один из них.

То, что я пытался (неудачно):

  • использование #include moc_some_header.cpp в source.cpp
    , как описано в документации CMake. Это приводит к ошибке, в которой cmake жалуется, что не может найти some_header {.h, .hpp, .hxx, .H}
  • , чтобы установить CMAKE_AUTOMOC_RELAXED_MODE значение true. Хотя из документа неясно, что это на самом деле делает. В любом случае, никаких изменений.
  • установка AUTOMOC_MOC_OPTIONS на -Isrc/include или -I/path/to/project/src/include или -I $ {CMAKE_HOME_DIRECTORY}/src/include
    Не делает ничего, что я мог видеть.

Замечательная вещь в AUTOMOC заключается в том, что мне не нужно знать, какие файлы на самом деле нужно издеваться. В этом случае, однако, мне нужно знать все заголовки, которые могут иметь Q_OBJECT внутри, которые включены моими исходными файлами.

Есть ли способ сказать AUTOMOC, где именно искать макеты?

ответ

0

Действительно ли вы установили AUTOMOC_MOC_OPTIONS в -Isrc/include или -I/path/to/myproject/src/include? Первое, вероятно, не существует.


Я всегда использовал макросы MOC; похоже, что AUTOMOC - это что-то новое, встроенное в CMake.

Я обычно включают в себя все заголовки при создании библиотеки или исполняемого файла - т.е.

add_library(foo SHARED source.cpp ../include/some_header.hpp) 

Я предположить, что это позволит AUTOMOC работать. Он будет иметь дополнительное преимущество, вызвав работу make, как и следовало ожидать - восстановление вашей библиотеки при изменении заголовка.

Если вы действительно не можете добавить файл в add_library команду раньше времени, то я думаю, что вы должны написать функцию CMake для поиска #include заявлений в source.cpp, найти эти файлы, и искать их для Q_OBJECT , Если они совпадают, добавьте их в переменную - возможно, EXTRA_MOCS. Затем линия add_library становится

add_library(foo SHARED source.cpp ${EXTRA_MOCS}) 
+0

Ах да, извините. Я попробовал несколько путей для опции -I. Абсолютный, относительный с использованием CMAKE_HOME_DIRECTORY ... никто не работал. – ifschleife

+0

И да, добавление заголовка в библиотеку явно работает, но я не могу этого сделать. Я сам подумал о другом решении (или о чем-то подобном), но мне кажется, что это громоздко сканировать заголовки. Я удивлен, что, кажется, нет способа сказать automoc также moc включить файлы ... – ifschleife

+2

Вы нашли способ достичь этого? Я нахожусь в одной лодке, просто используя Qt5. –

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