作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在尝试使用 Visual Studio 2019 的新 CMake 功能(特别是将 Clang 和 Ninja 与 CMake 和 VS2019 结合使用)来设置一个项目,该项目将使用多个编译器(包括 Clang、MSVC 和 GCC)。
我正在使用 CMake 将项目配置为“与编译器无关”,这样我就不需要编辑代码本身来通过预处理器指令或 #pragma
处理不同的编译器指示。
此项目需要配置为具有高警告级别( /W4
对于 MSVC, -Wall
, -Wextra
和 -Wpedantic
对于 Clang),并且必须将警告视为错误。
在配置项目的 MSVC 部分时,我没有任何问题。很多这些设置都有“正常”的默认值,正如我所期望的那样“正常工作”。但是,当涉及到 Clang 时,我遇到了一个问题:
我似乎无法禁用第三方库头文件的警告。我目前正在使用 Dear Imgui和 SFML图书馆。由于 Dear Imgui 未预编译,我只需在 CMakeLists.txt
中执行以下操作文件以包含它:
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}/libs/imgui
)
# Find SFML and link statically to it.
# Note: We need to set the SFML_DIR variable manually.
set(SFML_STATIC_LIBRARIES TRUE)
set(SFML_DIR "${CMAKE_CURRENT_SOURCE_DIR}/libs/SFML-2.5.1/lib/cmake/SFML")
find_package(SFML 2.5.1 COMPONENTS system audio window graphics REQUIRED)
target_link_libraries(${PROJECT_NAME}
PRIVATE
sfml-system
sfml-audio
sfml-window
sfml-graphics
)
CMakeLists.txt
的部分处理 Clang 和我的 C++ 配置的文件:
# Set project to use C++ 17 standard.
set_target_properties(
${PROJECT_NAME}
PROPERTIES
CXX_STANDARD 17
CXX_STANDARD_REQUIRED ON
)
target_compile_options(${PROJECT_NAME} PRIVATE
# All warnings, warnings as errors, be pedantic.
-Wall
-Wextra
-Werror
-Wpedantic
# Disable warnings about C++98 incompatibility. We're using C++17 features...
-Wno-c++98-compat
-Wno-c++98-compat-pedantic
)
set(LIBS_FOLDER "${CMAKE_CURRENT_SOURCE_DIR}/libs")
set(IMGUI_FOLDER "${LIBS_FOLDER}/imgui")
set(SFML_FOLDER "${LIBS_FOLDER}/SFML-2.5.1/include/SFML")
file(GLOB LIBRARY_FILES
# Dear-imgui
"${IMGUI_FOLDER}/*.cpp"
"${IMGUI_FOLDER}/misc/freetype/*.cpp"
"${IMGUI_FOLDER}/misc/fonts/*.cpp"
"${IMGUI_FOLDER}/misc/cpp/*.cpp"
# SFML
"${SFML_FOLDER}/Audio/*.cpp"
"${SFML_FOLDER}/Graphics/*.cpp"
"${SFML_FOLDER}/Network/*.cpp"
"${SFML_FOLDER}/System/*.cpp"
"${SFML_FOLDER}/Window/*.cpp"
)
set_source_files_properties(
${LIBRARY_FILES}
PROPERTIES
COMPILE_FLAGS
"-Wno-everything"
)
GLOB
开始-ing 我的库源文件
(注意:我知道 GLOB
通常被人看不起,但我觉得将它与第三方库文件一起使用很好,因为无论如何它们都不应该改变) .然后我将它们传递给
set_source_files_properties
应用
-Wno-everything
的函数标志,它似乎正确地抑制了这些文件中的所有错误和警告。
#pragma
我似乎无法禁用该警告。我的代码中的指令(我想避免)。编译空时
main
包含 SFML header 的函数,我收到有关他们的警告
.hpp
文件(不能传递给
set_source_files_properties
函数)。
#include <SFML/Graphics.hpp>
int main()
{
}
zero as null pointer constant [-Werror,-Wzero-as-null-pointer-constant]
declaration is marked with '\deprecated' command but does not have a deprecation attribute [-Werror,-Wdocumentation-deprecated-sync]
declaration is marked with '\deprecated' command but does not have a deprecation attribute [-Werror,-Wdocumentation-deprecated-sync]
declaration is marked with '\deprecated' command but does not have a deprecation attribute [-Werror,-Wdocumentation-deprecated-sync]
ThreadLocal.hpp (57)
Keyboard.hpp (161)
Event.hpp (105)
PrimitiveType.hpp (52)
.h
/.hpp
set_source_files_properties
中的文件CMake 函数(与 .cpp
文件一起)。适用于 Dear Imgui,但所有错误都在 .cpp
中文件,而不是它的标题。不适用于 SFML 的 header 。 SYSTEM
包括抑制警告。似乎在 Windows 上不起作用。不能用 SFML 真正做到这一点,因为我使用的是 CMake 的 find_package
功能,而不是手动完成所有操作。 #pragma
指示。虽然这有效,但每个 SFML 文件都有几十个不同的错误,我想避免使用 #pragma
s 无处不在(或将 SFML 的 header 包装在我自己的 header 中,这些 header 只是将 #include
指令包装在 #pragma
s 中)。 #pragma
的情况下抑制我的库标题的这些警告?我以前从未真正使用过 Clang,所以如果这看起来是一个简单的问题,我深表歉意,但在线搜索并没有真正给我任何有用的东西:
最佳答案
您可以将包含路径标记为 SYSTEM
.大多数编译器不会在系统头文件中报告警告。在您的情况下,可能看起来像这样:
include_directories(SYSTEM ${CMAKE_CURRENT_SOURCE_DIR}/libs/imgui)
set_target_properties(sfml-system PROPERTIES INTERFACE_SYSTEM_INCLUDE_DIRECTORIES $<TARGET_PROPERTY:sfml-system,INTERFACE_INCLUDE_DIRECTORIES>)
set_target_properties(sfml-audio PROPERTIES INTERFACE_SYSTEM_INCLUDE_DIRECTORIES $<TARGET_PROPERTY:sfml-audio,INTERFACE_INCLUDE_DIRECTORIES>)
set_target_properties(sfml-window PROPERTIES INTERFACE_SYSTEM_INCLUDE_DIRECTORIES $<TARGET_PROPERTY:sfml-window,INTERFACE_INCLUDE_DIRECTORIES>)
set_target_properties(sfml-graphics PROPERTIES INTERFACE_SYSTEM_INCLUDE_DIRECTORIES $<TARGET_PROPERTY:sfml-graphics,INTERFACE_INCLUDE_DIRECTORIES>)
例如,这个虚拟项目:
project(example)
cmake_minimum_required(VERSION 3.18)
add_library(dep INTERFACE)
target_include_directories(dep INTERFACE include)
file(WRITE include/header.h "static int a;")
add_library(lib STATIC lib.c)
target_link_libraries(lib PRIVATE dep)
target_compile_options(lib PRIVATE -Wunused -Werror)
file(WRITE lib.c "#include <header.h>")
失败:
$ cmake . && make
include/header.h:1:12: error: ‘a’ defined but not used [-Werror=unused-variable]
但是在添加这一行之后:
set_target_properties(dep PROPERTIES INTERFACE_SYSTEM_INCLUDE_DIRECTORIES $<TARGET_PROPERTY:dep,INTERFACE_INCLUDE_DIRECTORIES>)
它构建没有错误。
关于c++ - 如何在 CMakeLists.txt 文件中的第三方库头文件中抑制 Clang 警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56707123/
我是一名优秀的程序员,十分优秀!