我们的项目使用了非常严格的警告集,但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文件的列表。
答案 0 :(得分:3)
有点晚了,但是我找到了一个可行的解决方案(CMake 3.16)。
首先,Automoc无法生成警告。它是一个预处理器,接受一个cpp文件并生成一个moc文件。此操作不会生成编译警告。
在CMake中,将AUTOMOC属性设置为true
时,CMake会(至少)做两件事:
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")