如何忽略包含的第三方库上的“-W”消息?

How to ignore "-W" message on included third party libraries?

提问人:markzzz 提问时间:7/6/2023 最后编辑:HolyBlackCatmarkzzz 更新时间:11/1/2023 访问量:137

问:

我经常在我的 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/*

C++ GCC Makefile mingw 警告

评论

0赞 maxplus 7/6/2023
您可以使用不同的编译器标志编译源文件,然后将它们与您自己的源文件链接。如果在源文件中包含的标头中生成错误,我认为没有干净的解决方案(没有 /)。lib/...lib/...#pragma GCC diagnostic pushpop
0赞 markzzz 7/7/2023
@maxplus 你用不同的标志编译它们是什么意思?命令是 One...
0赞 markzzz 7/7/2023
当然@maxplus其中一些标头将被添加到我的标头/源文件中
1赞 HolyBlackCat 10/27/2023
使用代替可能会有所帮助。如果没有,s 是下一个最佳选择。此外,您可能喜欢递归通配符函数-isystem-I#pragma
0赞 markzzz 10/27/2023
@HolyBlackCat为什么能提供帮助?-isystem

答:

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,这不是那么好。至少,对于第一次编译......