本质上,我希望能够在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。
我尝试了什么(失败了):
AUTOMOC的优点在于我不需要知道实际需要嘲笑哪些文件。但是在这种情况下,我需要知道我的源文件中包含的所有可能包含Q_OBJECT的标头。
有没有办法告诉AUTOMOC究竟在哪里寻找可模拟的文件?
答案 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} )