我经常在我的 C++ 项目中包含外部/第三方库,并且几乎每次在编译我的代码时它们都包含 -W 警告消息。
它们位于
lib/*
文件夹中。具体来说,关于 Makefile,这就是我包含的内容:
# 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/*
文件夹,忽略警告消息?保持我的代码/编译干净吗?这是相当无聊的“混乱”,其他库警告为什么要编译和检查状态。
您应该能够通过将编译分为多个部分并应用不同的标志来抑制特定文件的警告。
例如
# 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>
。
对于源代码中包含的库标头,事情有点棘手。
一种方法可能是使用
#pragma
禁用包含标题的警告。
例如
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wall"
#pragma GCC diagnostic ignored "-Wextra"
#include "lib/whatever.hpp"
#pragma GCC diagnostic pop
这可能有点乏味,但希望比解决包含的标题中的每个单独警告要简单=)