我有一个项目,其中包含组织在 N
文件夹中的源文件和头文件(我们称它们为 folder1
、folder2
、...、文件夹N
)
我想用 -Wall
编译 folder1
,但用 -w
编译其余的。
问题是其他文件夹(2 到 N)仅包含头文件,这些头文件包含在folder1 中的某些源代码中。
当我编译 folder1
时,-Wall
也将应用于该文件夹中的 header ,但我不希望这样。
这是我到目前为止使用的 makefile:
CC=gcc
LIBS=-iquotefolder2 ... -iquotefoldern
SOURCES=$(wildcard folder1/*.c) $(wildcard folder2/*.c) ... $(wildcard foldern/*.c)
OBJECTS=$(SOURCES:.c=.o)
folder1/%.o: folder1/%.c
$(CC) -Wall $(LIBS) -c -o $@ $^
folder2/%.o: folder2/%.c
@$(CC) -w $(LIBS) -c -o $@ $^
...
folderN/%.o: folderN/%.c
@$(CC) -w $(LIBS) -c -o $@ $^
lib.dll: $(OBJECTS)
@$(CC) -w -shared -Wl,-soname,$@ -o $@ $^
all: lib.dll
有什么办法可以实现这一点吗? 我还尝试将folder2编译为lib.a中的folderN,并在编译folder1时链接该库,但gcc(显然)会尝试包含 header
最佳答案
你不能用 Makefile 来做到这一点。 Makefile 仅处理源文件,因此您可以仅在源文件粒度上在 Makefile 中提供标志。换句话说,gcc
在源文件上调用,并且 gcc
中未提及 header 调用。
但是,您可以指示gcc
调整不同文件中的警告:
密码
-isystem <dir>
标记为 gcc - 这将使gcc
将位于 dir 的 header 视为系统 header 。gcc
默认情况下不会在系统 header 中发出任何警告。使用
#pragma GCC diagnostic
忽略源文件中的警告:
来源:
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wall"
#include "folder2/bad-header.h"
#pragma GCC diagnostic pop
关于C Makefile,用不同的规则编译项目的各个部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40303659/