让 GCC 在 ./ 之前在 <dir> 中查找 headers

Make GCC look for headers in <dir> before ./

背景:

我正在为一个嵌入式项目构建一个测试环境。由于它是一个嵌入式项目,它会尝试访问硬件寄存器,例如ADC 结果、定时器设置、中断标志...

这些寄存器由 Halcogen(它是 TI 处理器)自动实现,如定义指向特定地址。

    #pragma system_include

    #ifndef __REG_FLASH_H__
    #define __REG_FLASH_H__

    /* USER CODE BEGIN (0) */
    /* USER CODE END */

    #include "sys_common.h"

    typedef volatile struct flashWBase
    {
        uint32 FRDCNTL;       /* 0x0000 */
        uint32   rsvd1;       /* 0x0004 */
        .
        .
        .
        uint32 EESTATUS;      /* 0x031C */
        uint32 EEUNCERRADD;   /* 0x0320 */
    } flashWBASE_t;

    #define flashWREG ((flashWBASE_t *)(0xFFF87000U)) //<--- This one

    #endif

我尝试的解决方案:

为了在 MinGW Win7 机器上编译和 运行 此代码,这些特定地址需要 re-defined 以指向可观察和可变变量。我有一个分析源代码的 Python 脚本;在包含以下内容的公共目录中使用相同的名称创建新的 header 文件:

    #ifndef _COMMON_INCLUDES_REG_FLASH_H_
    #define _COMMON_INCLUDES_REG_FLASH_H_

    #include "..\..\W2_Library\Halcogen\Include\reg_flash.h" //<--- original Halcogen header

    #undef flashWREG
    flashWBASE_t _flashWREG;
    #define flashWREG (&_flashWREG)

    #endif

我已经多次尝试使用 -I--I<dir>-iquote 来重定向包含使用已弃用的 -I- 最远的 header 到让 GCC 忽略 . 目录。但是,我宁愿让我的 Common 文件夹位于 . 之前,而不是一起忽略。添加 -I. 似乎不是一回事,我感觉它扩展到源代码目录并且不会停留 "relative" 因为 GCC 像原来一样深入研究包含树.做。

让我的 Python 脚本克隆整个 header,仅用变量替换 HW 地址可能是一个解决方案。然而,只是在单独的 header 中重新定义寄存器定义确实不太容易被破坏。

问题:

还有其他方法可以改变搜索顺序吗? 我已经阅读了几个关于 -I- 的问题,但是 none 对于如何解决该行为确实有任何答案。 This question 非常接近,但与该用户不同,我没有使用预编译的 headers.

以上假设有几点,如有错误请指正!

您遇到的问题是 #include "..." 而不是 #include <...>

对于普通的 C 编译器,使用 " 形式总是在与当前文件相同的目录中搜索,然后 然后 在由 -I。如果你想在查看当前文件的目录之前搜索其他地方,没有简单的方法可以做到这一点。

您可以使用 gcc 的 -I- 抑制 在当前文件的目录中搜索,并添加其他目录以仅用于 " 包含文件(不是对于 <>),但如果你使用它,则无法恢复在当前文件目录中搜索的行为。

您可以尝试类似的方法:

-ICommon -I. -I- -Iwhatever

这将首先在 Common 中搜索 ",然后在当前工作目录中搜索,然后在 whatever(以及正常路径的其余部分)中搜索,而 <> 将在 whatever 开始。不幸的是,如果当前文件目录与当前工作目录不同,它将永远不会在当前文件目录中搜索。

-I- 也已弃用,因此可能很快就会消失。