我有一个项目,其中包含在N
个文件夹中组织的源文件和标题文件(让我们称之为folder1
,folder2
,...,folderN
)
我想用folder1
汇编-Wall
,但其余的-w
。
问题是其他文件夹(2到N)只包含头文件,这些文件包含在folder1的某些源中。
当我编译folder1
时,-Wall
也会应用于该文件夹中的标题,我不希望这样。
这是我到目前为止使用的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
有没有办法实现这个目标? 我还尝试在lib.a中将folder2编译到folderN,并在编译folder1时链接该库,但gcc(显然)会尝试包含头文件
答案 0 :(得分:1)
你不能用Makefile做到这一点。 Makefile只处理源文件,因此您只能在源文件粒度上提供Makefile中的标志。换句话说,在源文件上调用gcc
,gcc
调用中未提及标题。
但是,您可以指示gcc
调整不同文件中的警告:
将-isystem <dir>
标记传递给gcc - 这会使gcc
将位于 dir 的标题视为系统标头。默认情况下,gcc
不会在系统标头中发出任何警告。
使用#pragma GCC diagnostic
忽略源文件中的警告:
来源:
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wall"
#include "folder2/bad-header.h"
#pragma GCC diagnostic pop