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

问题描述 投票:0回答:2

我想在我的include文件夹中的任何源文件中使用我的src文件夹中的任何标题。现在,我正在做"#include ../../include/subfolder/file.h"#include "../include/otherfile.h"to访问我的头文件,但这非常冗长,每当我进行目录重组时,我必须返回并更改对受影响的头文件的每个引用。我想能够从任何源文件中执行#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 {} +
c++ c makefile
2个回答
1
投票

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

 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时,这些目录将不存在。


2
投票

简单,只需使用

#include <myheader.h>

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

例如,如果myheader.h在include /子文件夹中,那么,

$(CC) -Iinclude/subfolder

将工作。

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

© www.soinside.com 2019 - 2024. All rights reserved.