C Makefile,用不同的规则编译项目的各个部分

时间:2016-10-28 10:59:38

标签: c makefile

我有一个项目,其中包含在N个文件夹中组织的源文件和标题文件(让我们称之为folder1folder2,...,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(显然)会尝试包含头文件

1 个答案:

答案 0 :(得分:1)

你不能用Makefile做到这一点。 Makefile只处理源文件,因此您只能在源文件粒度上提供Makefile中的标志。换句话说,在源文件上调用gccgcc调用中未提及标题。

但是,您可以指示gcc调整不同文件中的警告:

  1. -isystem <dir>标记传递给gcc - 这会使gcc将位于 dir 的标题视为系统标头。默认情况下,gcc不会在系统标头中发出任何警告。

  2. 使用#pragma GCC diagnostic忽略源文件中的警告:

  3. 来源:

    #pragma GCC diagnostic push
    #pragma GCC diagnostic ignored "-Wall"
    #include "folder2/bad-header.h"
    #pragma GCC diagnostic pop