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

标签 c makefile

我有一个项目,其中包含组织在 N 文件夹中的源文件和头文件(我们称它们为 folder1folder2、...、文件夹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调整不同文件中的警告:

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

  2. 使用 #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/

相关文章:

c - 不明白C中的内存冲浪

linux - 在 shell 脚本中使用 makefile 变量而不运行 make

linux - 如何使用安装前缀

c++ - 为什么我可以在 C 而不是 C++ 中设置一个匿名枚举等于另一个?

c - 查找服务器的IP和端口

c++ - 在 travis for clang 上使用不同的 libc++ 版本

opencv - 在 Ubuntu/Linux 上用 C++ 编译 OpenCV 代码的 Makefile

makefile - 有 make 命令退出 1

c - 指向函数指针的指针是否可以转换为 void 指针,反之亦然?

c - 递增指针而不是递增数组及其索引