在不知道文件名的情况下,在外部头文件上使用cmake的automoc

时间:2012-10-18 14:32:26

标签: c++ qt4 cmake automocking

本质上,我希望能够在cmake中使用不属于任何目标的moc头文件,并且我不知道这些头文件的文件名。

实际项目非常复杂,是自动构建系统的一部分。以下是一个简单的例子。 考虑一个这样结构的项目:

CMakeLists.txt
src / lib / source.cpp
src / lib / 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。

我尝试了什么(失败了):

  • 在source.cpp中使用#include moc_some_header.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究竟在哪里寻找可模拟的文件?

1 个答案:

答案 0 :(得分:1)

您是否真的将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} )