我们的项目使用了非常严格的警告,但是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文件的列表。
2条答案
按热度按时间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
一旦你知道了这个路径,你就可以通过只向这个文件传递编译标志来消除一些警告:
在CMake 3.18或更高版本中,如果源文件被添加到不同的
CMakeLists.txt
文件中,则还必须使用DIRECTORY
或TARGET_DIRECTORY
之一(例如,如果您试图从根CMakeLists.txt
设置COMPILE_FLAGS
,但目标是在foo/CMakeLists.txt
中创建的):即使路径在将来发生了变化,CMake也总是有一个“通用”的cpp文件,其中包括所有其他的MOC文件。如果你能找到这个文件的路径,这个解决方案就可以工作了。
在您的例子中(旧版CMake),这个文件是
Notification_automoc.cpp
,所以下面的行 * 应该 * 可以工作:set_source_files_properties("Notification_automoc.cpp" PROPERTIES COMPILE_FLAGS "-Wno-undefined-reinterpret-cast")
j7dteeu82#
您可以通过在moc命令行上传递'no warning'选项来禁用所有AUTOMOC警告。
CMAKE_AUTOMOC_MOC_OPTIONS
初始化AUTOMOC_MOC_OPTIONS
,其文档链接如下。