Использование automoc cmake для внешних заголовочных файлов, не зная их имен файлов

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

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

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

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

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

Содержимое src / lib / CMakeLists.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)

Внутри 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, где именно искать поддельные файлы?

3

Решение

Вы действительно установили 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} )
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]