我正在尝试在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 {} +
答案 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
时,这些目录将不存在。