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

cvxl0en2  于 2023-03-23  发布在  其他
关注(0)|答案(2)|浏览(600)

我们的项目使用了非常严格的警告,但是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也不起作用)。我不想手工维护一个由生成生成的所有moc文件的列表。

slhcrj9b

slhcrj9b1#

有点晚,但我找到了一个有效的解决方案(CMake 3.16)。
首先,Automoc不能生成警告。它是一个预处理器,它接受一个cpp文件并生成一个moc文件。这个操作不会生成编译警告。
在CMake中,当您将AUTOMOC属性设置为true时,CMake(至少)会做两件事:
1.它将所有源代码提供给MOC以生成MOC文件(这些MOC文件不会添加到您的目标中,我们不关心它们)
1.它创建一个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 3.18或更高版本中,如果源文件被添加到不同的CMakeLists.txt文件中,则还必须使用DIRECTORYTARGET_DIRECTORY之一(例如,如果您试图从根CMakeLists.txt设置COMPILE_FLAGS,但目标是在foo/CMakeLists.txt中创建的):

set_source_files_properties("<target_name>_autogen/mocs_compilation.cpp"
    TARGET_DIRECTORY <target_name>
    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")

j7dteeu8

j7dteeu82#

您可以通过在moc命令行上传递'no warning'选项来禁用所有AUTOMOC警告。CMAKE_AUTOMOC_MOC_OPTIONS初始化AUTOMOC_MOC_OPTIONS,其文档链接如下。

SET(CMAKE_AUTOMOC   ON)
SET(CMAKE_AUTOMOC_MOC_OPTIONS "-nw")
  • AUTOMOC_MOC_OPTIONS参考
  • moc命令行参数参考

相关问题