【问题标题】:Using cmake's automoc on external header files without knowing their filenames在不知道文件名的情况下对外部头文件使用 cmake 的 automoc
【发布时间】:2012-10-18 14:32:25
【问题描述】:

本质上,我希望能够 moc 不属于 cmake 中任何目标的头文件,但额外的困难是我不知道这些头文件的文件名。

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

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 在哪里寻找可模拟文件?

【问题讨论】:

    标签: c++ qt4 cmake automocking


    【解决方案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 中的#include 语句source.cpp,找到这些文件,并搜索他们Q_OBJECT。如果它们匹配,请将它们添加到变量中 - 可能是 EXTRA_MOCS。然后,add_library 行变为

    add_library(foo SHARED source.cpp ${EXTRA_MOCS} )
    

    【讨论】:

    • 啊,是的,对不起。我确实为 -I 选项尝试了几种路径。绝对的,使用 CMAKE_HOME_DIRECTORY 的相对...没有工作。
    • 是的,将标头添加到库中明确有效,但我不能这样做。我自己想到了其他解决方案(或类似的解决方案),但自己扫描标题似乎很麻烦。我很惊讶似乎没有办法告诉 automoc 也 moc 包含文件......
    • 您找到实现此目的的方法了吗?我在同一条船上,只是使用 Qt5。
    • 也在同一条船上。 ifschleife, @vaibhav-desai 你找到解决方案了吗?
    • 换工作。所以永远不必处理它:)
    猜你喜欢
    • 1970-01-01
    • 2017-09-16
    • 2013-11-18
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 2014-02-23
    • 2011-09-23
    相关资源
    最近更新 更多