[英]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.