c++ - 在不知道文件名的情况下对外部头文件使用 cmake 的 automoc

标签 c++ qt4 cmake automocking

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

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

CMakeLists.txt
源文件/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 需要发挥它的魔力。但由于 header 不在实际项目中,因此 header 不会被模拟。我什至不知道 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 的 header ,这些 header 包含在我的源文件中。

有没有办法告诉 AUTOMOC 确切在哪里寻找可模拟文件?

最佳答案

您是否真的将 AUTOMOC_MOC_OPTIONS 设置为 -Isrc/include,或 -I/path/to/myproject/src/include?前者可能不存在。


我一直使用 MOC 宏;看起来 AUTOMOC 是 CMake 中内置的新东西。

我通常在创建库或可执行文件时包含所有 header - 即

add_library(foo SHARED source.cpp ../include/some_header.hpp )

假设这将允许AUTOMOC 工作。它还有一个额外的好处,可以使 make 按预期工作 - 当 header 更改时重建您的库。

如果您确实无法提前将文件添加到 add_library 命令,那么我认为您将不得不编写一个 cmake 函数来搜索 #include source.cpp 中的语句,找到这些文件,并在其中搜索 Q_OBJECT。如果它们匹配,将它们添加到一个变量中——也许是 EXTRA_MOCS。然后,add_library 行变为

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

关于c++ - 在不知道文件名的情况下对外部头文件使用 cmake 的 automoc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12957059/

相关文章:

C++ 成员引用基类型 'Vertex *const' 不是结构或 union

qt - 在 Qt 中制作自定义菜单栏

c++ - ARM 设备的交叉编译库

c++ - 使用 CMakeLists.txt 构建 qt 编译输出 make : *** No rule to make target `all' . Stop

c++ - 我想用两个版本的 libQtCore.a 检查目标代码

c++ - 在 C++ 中暂停程序执行 5 秒

c++ - QTextEdit 作为 HTML 编辑器

c++ - CMake:包含目录的排序(如何混合基于系统和用户的包含路径?)

bluetooth - 蓝牙的 Cmake 和库链接器标志

c++ - 用于 OpenWRT 的 CMake/Linker 交叉编译