如何让cmake仅为automoc文件添加编译器定义

时间:2016-03-31 17:43:25

标签: qt cmake automoc

我们的项目使用了非常严格的警告集,但Qt5生成的moc文件会产生违反这些警告的代码。我们显然可以在全球范围内关闭警告,但我想要禁止automoc文件的警告。

例如:

In file included from /Users/stebro/client/build/NotificationServer/Notification_automoc.cpp:2:
/Users/stebro/client/build/NotificationServer/moc_NotificationServer.cpp:100:18: error: dereference of type '_t *' (aka 'void (carbonite::NotificationServer::**)(const QByteArray &, const QString, const QVariant)') that was reinterpret_cast from type 'void **' has undefined behavior [-Werror,-Wundefined-reinterpret-cast]
            if (*reinterpret_cast<_t *>(func) == static_cast<_t>(&NotificationServer::notificationQueued)) {
                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~

以下不起作用:

set_property(
  DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  PROPERTY COMPILE_DEFINITIONS -Wundefined-reinterpret-cast
  )

cmake抱怨:

  set_property DIRECTORY scope provided but requested directory was not
  found.  This could be because the directory argument was invalid or, it is
  valid but has not been processed yet.

我无法使用set_property(FILE ...),因为我没有完整的文件列表,这些文件是在构建makefile时自动生成的(因此可能是GLOBing赢了&# 39;工作要么)。我不想手工维护将由构建生成的所有moc文件的列表。

2 个答案:

答案 0 :(得分:3)

有点晚了,但是我找到了一个可行的解决方案(CMake 3.16)。

首先,Automoc无法生成警告。它是一个预处理器,接受一个cpp文件并生成一个moc文件。此操作不会生成编译警告。

在CMake中,将AUTOMOC属性设置为true时,CMake会(至少)做两件事:

  1. 它会将您所有的来源都提供给MOC来生成moc文件(这些MOC文件不会添加到您的目标中,我们也不会在意它们)
  2. 它将创建一个mocs_compilation.cpp文件,其中包含所有必需的moc文件,然后将此文件添加到目标中,然后进行编译。

仅此第二项操作可以生成警告。您要沉默的就是编译步骤。


在我的情况下(CMake 3.16),mocs_compilation文件是在以下路径中生成的:

${<target_name>_BINARY_DIR}/<target_name>_autogen/mocs_compilation.cpp 而且,一旦知道了该路径,就可以通过仅向该文件传递编译标志来使某些警告静音:

set_source_files_properties("<target_name>_autogen/mocs_compilation.cpp" PROPERTIES COMPILE_FLAGS "-Wno-undefined-reinterpret-cast")

即使将来更改路径,CMake也会始终具有一个“通用” cpp文件,其中包括所有其他MOC文件。如果您可以找到此文件的路径,则此解决方案将起作用。


在您的情况下(较旧的CMake版本),此文件为Notification_automoc.cpp,因此以下行应该应该起作用:

set_source_files_properties("Notification_automoc.cpp" PROPERTIES COMPILE_FLAGS "-Wno-undefined-reinterpret-cast")

答案 1 :(得分:0)

您可以通过传递“无警告”来禁用所有AUTOMOC警告。 moc命令行上的选项。 CMAKE_AUTOMOC_MOC_OPTIONS初始化其文档链接如下的AUTOMOC_MOC_OPTIONS

SET(CMAKE_AUTOMOC   ON)
SET(CMAKE_AUTOMOC_MOC_OPTIONS "-nw")