查找所有子目录中的所有头文件

时间:2018-02-07 21:49:35

标签: c++ c makefile

我正在尝试在include文件夹中的任何源文件中使用src文件夹中的任何标头。现在,我正在使用"#include ../../include/subfolder/file.h"#include "../include/otherfile.h"来访问我的头文件,但这非常详细,每当我进行目录重组时,我都必须返回并更改每个引用受影响的头文件。我希望能够从任何源文件中执行#include "file.h",但我似乎无法做到。由于某种原因,-Iinclude-Iinclude/无法在subfolder中找到标题。将我的include语句更改为#include <file.h>也不起作用。我该怎么做才能解决这个问题?

我的项目布局如下:

Makefile

include
    subfolder
        file.h
    otherfile.h

src
    subfolder
        file.c
    otherfile.c

我的Makefile看起来像这样:

TARGET = program
LIBS = -llibs
CC = gcc
CFLAGS = -Wall -g -Iinclude/

.PHONY: default all clean

default: $(TARGET)
all: default

OBJECTS = $(patsubst %.c, %.o, $(shell find . -name '*.c'))
HEADERS = $(shell find . -name '*.h')

%.o: %.c $(HEADERS)
    $(CC) $(CFLAGS) -c $< -o $@

.PRECIOUS: $(TARGET) $(OBJECTS)

$(TARGET): $(OBJECTS)
    $(CC) $(OBJECTS) -Wall $(LIBS) -o $@

clean:
    find . -type f -name '*.o' -exec rm {} +
    find . -type f -name $(TARGET) -exec rm {} +

2 个答案:

答案 0 :(得分:2)

简单,只需使用

#include <myheader.h>

并通过-I开关将相关目录传递给编译器。

例如,如果 myheader.h include / subfolder 中,那么,

$(CC) -Iinclude/subfolder

会奏效。

请注意,您还必须在-I参数中包含子文件夹,因为只扫描顶级目录中的标题。

答案 1 :(得分:1)

您可以简单地自动生成包含目标标志:

 INC_DIRS := $(shell find include -type d)
 C_INC_FLAGS := $(addprefix -I,$(INC_DIRS))

 %.o: %.c $(HEADERS)
    $(CC) $(CFLAGS) $(C_INC_FLAGS) -c $< -o $@

请注意,大多数系统都有最大行长度(通常约为64k),因此如果你有很多目录,你可能不得不担心超过最大行长度(此时你将dirs管道传输到文件中)并包含@file ...)

此外,如果您通过make规则在include目录中自动生成新目录,这不起作用,因为当您第一次填充INC_DIRS时,这些目录将不存在。