簡體   English   中英

在所有子目錄中查找所有頭文件

[英]Find all header files in all sub-directories

我正在嘗試使用src文件夾中任何源文件中的include文件夾中的任何標頭。 現在,我正在執行"#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 {} +

簡單,只需使用

#include <myheader.h>

並通過-I開關將相關目錄傳遞給編譯器。

例如,如果myheader.h位於包含/子文件夾中

$(CC) -Iinclude/subfolder

將工作。

請注意,您還必須在-I參數中包含子文件夾,因為僅會在頂級目錄中掃描標題。

您可以簡單地自動生成include 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),因此,如果有很多目錄,則可能要擔心超過最大行長(此時,將目錄傳送到文件並包含@file ...)

另外,如果您通過make規則在include目錄中自動生成新目錄,則此方法也無效,因為當您第一次填充INC_DIRS時,這些目錄將不會存在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM