让GCC在./之前查找标题./

时间:2015-12-09 15:07:29

标签: c gcc include-path

背景:

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

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

void Foo(int a, int b) => new Func<int, int>((x) => x + 1).ArgumentTransform(Bar)(a, b);

我尝试过的解决方案:

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

    #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

我使用 #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重定向包含最远的标头,以使GCC忽略{{1} }} 目录。但是,我宁愿让-I-文件夹位于.之前而不是忽略所有文件夹。添加Common似乎不是一回事,我觉得它扩展到源代码的目录并且不会保持“相对”,因为GCC深入研究包含树,就像原始{{ 1}}做。

让我的Python脚本克隆整个标头,只用硬件地址替换变量,可能是一个解决方案。只是重新定义寄存器在单独的标题中定义但是不太容易破坏。

问题:

有没有其他方法可以改变搜索顺序? 我已经阅读了几个关于.的问题,但没有人真正对你如何绕过这个行为有任何答案。 This question非常接近,但与该用户不同,我没有使用预编译的标头。

上面有一些假设,请纠正我,如果他们错了!

1 个答案:

答案 0 :(得分:4)

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

使用普通的C编译器时,使用-I表单始终在与当前文件相同的目录中搜索,然后-I-设置的包含路径中查找。如果你想在查看当前文件的目录之前搜索其他地方,那么就没有简单的方法了。

您可以使用gcc的"禁止在当前文件的目录中搜索,并添加其他目录以仅用于<>包含文件(不适用于-ICommon -I. -I- -Iwhatever ),但如果您使用该文件,则无法恢复在当前文件目录中搜索的行为。

您可以尝试以下内容:

"

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

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