3

本质上,我希望能够 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 究竟在哪里寻找可模拟文件?

4

1 回答 1

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 函数#includesource.cpp搜索Q_OBJECT. 如果它们匹配,请将它们添加到变量中 - 也许EXTRA_MOCS. 然后,这add_library条线变成

add_library(foo SHARED source.cpp ${EXTRA_MOCS} )
于 2012-10-20T23:54:56.120 回答