По сути, я хочу иметь возможность манипулировать заголовочными файлами, которые не являются частью какой-либо цели в 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 на наличие поддельных файлов, даже если исходный файл содержит один из них.
Что я пробовал (безуспешно):
Самое замечательное в AUTOMOC заключается в том, что мне не нужно знать, какие файлы на самом деле нужно смоделировать. В этом случае, однако, мне нужно знать все заголовки, которые могут иметь Q_OBJECT внутри, которые включены в мои исходные файлы.
Есть ли способ сообщить AUTOMOC, где именно искать поддельные файлы?
Вы действительно установили 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} )
Других решений пока нет …