提问人:markzzz 提问时间:7/6/2023 最后编辑:HolyBlackCatmarkzzz 更新时间:11/1/2023 访问量:137
如何忽略包含的第三方库上的“-W”消息?
How to ignore "-W" message on included third party libraries?
问:
我经常在我的 C++ 项目中包含外部/第三方库,几乎每次它们在编译代码时都包含 -W 警告消息。
它们位于文件夹上。特别是在 Makefile 上,这就是我所包含的内容:lib/*
# Add .h and .hpp to the preprocessor build
HEADERS += $(wildcard lib/*.h)
HEADERS += $(wildcard lib/*.hpp)
HEADERS += $(wildcard lib/**/*.h)
HEADERS += $(wildcard lib/**/*.hpp)
HEADERS += $(wildcard lib/**/**/*.h)
HEADERS += $(wildcard lib/**/**/*.hpp)
HEADERS += $(wildcard src/*.h)
HEADERS += $(wildcard src/*.hpp)
HEADERS += $(wildcard src/**/*.h)
HEADERS += $(wildcard src/**/*.hpp)
# Add .c and .cpp files to the build
SOURCES += $(wildcard lib/*.c)
SOURCES += $(wildcard lib/*.cpp)
SOURCES += $(wildcard lib/**/*.c)
SOURCES += $(wildcard lib/**/*.cpp)
SOURCES += $(wildcard lib/**/**/*.c)
SOURCES += $(wildcard lib/**/**/*.cpp)
SOURCES += $(wildcard src/*.c)
SOURCES += $(wildcard src/*.cpp)
SOURCES += $(wildcard src/**/*.c)
SOURCES += $(wildcard src/**/*.cpp)
# FLAGS will be passed to both the C and C++ compiler
FLAGS +=
CFLAGS +=
CXXFLAGS += $(sort $(foreach HEADERS, $(HEADERS), -I$(dir $(HEADERS))))
是否可以指定(我在 Windows 上使用 MingGW,所以“gcc”)对于该文件夹,忽略警告消息?保持我的代码/编译干净?它与其他库非常无聊的“混乱”警告为什么要编译和检查状态。lib/*
答:
2赞
Increasingly Idiotic
11/1/2023
#1
您应该能够通过将编译划分为多个部分并应用不同的标志来禁止显示特定文件的警告。
例如
# Your sources and headers
SRC_HEADERS := $(wildcard src/*.h) $(wildcard src/*.hpp) $(wildcard src/**/*.h) $(wildcard src/**/*.hpp)
SRC_SOURCES := $(wildcard src/*.c) $(wildcard src/*.cpp) $(wildcard src/**/*.c) $(wildcard src/**/*.cpp)
# Third-party libraries' sources and headers
LIB_HEADERS := $(wildcard lib/*.h) $(wildcard lib/*.hpp) $(wildcard lib/**/*.h) $(wildcard lib/**/*.hpp) $(wildcard lib/**/**/*.h) $(wildcard lib/**/**/*.hpp)
LIB_SOURCES := $(wildcard lib/*.c) $(wildcard lib/*.cpp) $(wildcard lib/**/*.c) $(wildcard lib/**/*.cpp) $(wildcard lib/**/**/*.c) $(wildcard lib/**/**/*.cpp)
# FLAGS for your sources
SRC_FLAGS :=
SRC_CFLAGS :=
SRC_CXXFLAGS := $(sort $(foreach HEADERS, $(SRC_HEADERS), -I$(dir $(SRC_HEADERS))))
# FLAGS for third-party libraries (suppress all warnings using -w)
LIB_FLAGS := -w
LIB_CFLAGS := -w
LIB_CXXFLAGS := $(sort $(foreach HEADERS, $(LIB_HEADERS), -I$(dir $(LIB_HEADERS))))
# Targets and rules
...
# Rule for compiling your sources
%.o: %.cpp
$(CXX) $(SRC_FLAGS) $(SRC_CXXFLAGS) -o $@ -c $<
# Rule for compiling third-party libraries
lib/%.o: lib/%.cpp
$(CXX) $(LIB_FLAGS) $(LIB_CXXFLAGS) -o $@ -c $<
注意 将禁止显示所有警告。如果要有选择地禁用特定警告,可以使用特定标志,例如 .-w
-Wno-<specific-warning>
对于源中包含的库头文件,事情有点棘手。
一种方法可能是使用 s 来禁用包含标头的警告。#pragma
例如
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wall"
#pragma GCC diagnostic ignored "-Wextra"
#include "lib/whatever.hpp"
#pragma GCC diagnostic pop
这可能有点乏味,但希望比解决包含的标题中的每个单独警告不那么乏味 =)
评论
0赞
markzzz
11/4/2023
最后一个approch的问题在于,如果一个外部库在.cpp上使用其.hpp,我需要编辑“原始”src,这不是那么好。至少,对于第一次编译......
评论
lib/...
lib/...
#pragma GCC diagnostic push
pop
-isystem
-I
#pragma
-isystem