本质上,我希望能够 moc 不属于 cmake 中任何目标的头文件,但额外的困难是我不知道这些头文件的文件名。
实际项目非常复杂,并且是自动构建系统的一部分。下面是一个简单的例子。考虑一个结构如下的项目:
CMakeLists.txt
src/lib/source.cpp
src/lib/CMakeLists.txt
src/include/some_header.hpp # 包含在 source.cpp
中 main 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 中的可模拟文件。
我尝试过的(不成功):
如 cmake 文档中所述,在 source.cpp 中使用 #include moc_some_header.cpp 。这会导致错误,其中 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 究竟在哪里寻找可模拟文件?