【问题标题】:C Makefile, Compile parts of the project with different rulesC Makefile,用不同的规则编译项目的部分
【发布时间】:2016-10-28 10:59:37
【问题描述】:

我有一个项目,其中包含在N 文件夹中组织的源文件和头文件(我们称它们为folder1、folder2、...、folderN)

我想用-Wall 编译folder1,但其余的用-w。 问题是其他文件夹(2 到 N)只包含文件夹 1 中某些源中包含的头文件。

当我编译 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

有什么方法可以实现吗? 我还尝试将文件夹 2 编译到 lib.a 中的文件夹 N 并在编译文件夹 1 时链接该库,但 gcc 将(显然)尝试包含标题

【问题讨论】:

标签: c makefile


【解决方案1】:

Makefile 无法做到这一点。 Makefile 仅处理源文件,因此您可以在 Makefile 中仅在源文件粒度上提供标志。换句话说,gcc 是在源文件上调用的,而在 gcc 调用中没有提到标头。

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

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

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

来源:

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

【讨论】:

  • 另一方面,-isystem<dir> 非常适合我的需要,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-16
  • 2013-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多