查找所有子目录中的所有头文件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查找所有子目录中的所有头文件相关的知识,希望对你有一定的参考价值。
我想在我的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 {} +
答案
您可以简单地自动生成包含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
时,这些目录将不存在。
另一答案
简单,只需使用
#include <myheader.h>
并通过-I
开关将相关目录传递给编译器。
例如,如果myheader.h在include /子文件夹中,那么,
$(CC) -Iinclude/subfolder
将工作。
请注意,您还必须在-I
参数中包含子文件夹,因为只扫描顶级目录的标题。
以上是关于查找所有子目录中的所有头文件的主要内容,如果未能解决你的问题,请参考以下文章