C 生成文件头包括

C 生成文件头包括,c,gcc,makefile,C,Gcc,Makefile,我正在为一个旧项目开发一个Makefile。新的Makefile基于我在其他项目中成功使用的旧Makefile,但现在我面临一个奇怪的问题 我的项目具有以下形式: ├── Makefile └── src ├── folder1 │   ├── somefiles.c │   └── somefiles.h ├── folder2 │   ├── problematic.h │   ├── somefiles.c │   ├── somef

我正在为一个旧项目开发一个Makefile。新的Makefile基于我在其他项目中成功使用的旧Makefile,但现在我面临一个奇怪的问题

我的项目具有以下形式:

├── Makefile
└── src
    ├── folder1
    │   ├── somefiles.c
    │   └── somefiles.h
    ├── folder2
    │   ├── problematic.h
    │   ├── somefiles.c
    │   ├── somefiles.h
    │   └── subdir
    │       └── included_file.h
    └── folder3
        ├── somefiles.c
        └── somefiles.h
我的Makefile包含以下行:

LIBRARY_INC_PATHS     = $(addprefix -I, $(shell find . -name '*.h' -printf '"%h"\n' | sort -u))
文件
problem.h
中有一行:

#include "subdir/included_file.h"
这会引起麻烦。GCC说没有这样的文件或目录

如果我将其更改为:

#include "included_file.h"
问题消失了,但在我的情况下,这不是一个可接受的解决方案


我应该对makefile进行哪些修改,以便使用相对路径(而不仅仅是名称)包含C代码中的文件?

您有多少个文件夹?仅仅显式地命名include目录而不是find调用会不会太费力?是的,实际项目有几十个文件。明确列出所有目录是不现实的。老实说,剧烈的更改(需要更改整个列表,而不是简单的添加)不太可能发生。所以这似乎不仅仅是一次性的努力,你可能是对的。但现在这主要是一件好奇的事情,为什么这么明显的事情(对我来说)不起作用?我真的很困惑。无论您传递给编译器的是什么
-I..
标志,相对标题都应该有效,除非您的
有问题.h
有一些软/硬链接从不同的位置指向它,其中
subdir
不存在,并且您意外地包含了它。我无法重现错误。如果我使用
-Isrc/folder2
,它可以工作。(我使用的是gcc 4.2.1)您有多少个文件夹?仅仅显式地命名include目录而不是find调用会不会太费力?是的,实际项目有几十个文件。明确列出所有目录是不现实的。老实说,剧烈的更改(需要更改整个列表,而不是简单的添加)不太可能发生。所以这似乎不仅仅是一次性的努力,你可能是对的。但现在这主要是一件好奇的事情,为什么这么明显的事情(对我来说)不起作用?我真的很困惑。无论您传递给编译器的是什么
-I..
标志,相对标题都应该有效,除非您的
有问题.h
有一些软/硬链接从不同的位置指向它,其中
subdir
不存在,并且您意外地包含了它。我无法重现错误。如果我使用
-Isrc/folder2
,它可以工作。(我使用的是gcc 4.2.1)