【问题标题】:Make GCC look for headers in <dir> before ./让 GCC 在 ./ 之前查找 <dir> 中的标头
【发布时间】:2016-03-14 22:09:43
【问题描述】:

背景:

我正在为一个嵌入式项目构建一个测试环境。由于它是一个嵌入式项目,它会尝试访问硬件寄存器,例如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 机器上编译和运行此代码,需要重新定义这些特定地址以指向可观察和可变变量。我有一个分析源代码的 Python 脚本;在包含以下内容的公共目录中使用相同的名称创建新的头文件:

    #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&lt;dir&gt;-iquote 来重定向包含的标头,使用已弃用的-I- 使GCC 忽略. 目录。但是,我宁愿将我的 Common 文件夹放在 . 之前,而不是一起忽略。添加-I. 似乎不是一回事,我感觉它会扩展到源代码目录并且不会保持“相对”,因为 GCC 会像原来的 . 那样深入研究包含树.

让我的 Python 脚本克隆整个标头,只用变量替换硬件地址,这可能是一个解决方案。然而,仅仅在单独的头文件中重新定义寄存器定义确实不太容易出错。

问题:

还有其他方法可以改变搜索顺序吗? 我已经阅读了几个关于-I- 的问题,但没有一个关于你如何解决这种行为的答案。 This question 非常接近,但与那个用户不同,我没有使用预编译的头文件。

以上有一些假设,如有错误请指正!

【问题讨论】:

  • 快速搜索出现了this,除了使用-I 之外的-nostdinc 在这里可能会有所帮助。我将其发布为评论而不是答案,因为我不知道它是否真的回答了您的问题,而且我目前没有方便的 linux 盒子来尝试这个。
  • 如果您使用-I 选项添加要搜索的路径,那么您可以使用&lt;&gt; 语法在该目录中包含文件,然后预处理器将在添加的搜索路径中查找文件。
  • 我不确定我理解你想要什么。我建议您使用 gcc --verbose 进行编译,并为我们提供它为两个版本的 include 输出的搜索路径,以及您提供的命令行参数和您喜欢的搜索路径。 BTW -I. 在调用 gcc 的目录中查找,而 -I- 删除了在包含指令的文件目录中查找的可能性,因此它们确实不同。
  • @JamesH 感谢您的查找,但使用 -nostdinc 将删除除 . 引用之外的所有标准包含路径,使其仍然是第一个要搜索的路径。
  • @Enok82 我刚刚使用 GCC 4.7 版进行了测试,使用了两个头文件 ./foo.h./t/foo.h。如果我在没有任何特殊选项的情况下使用#include &lt;foo.h&gt;,则包含./foo.h。如果我添加了-It 以将t 目录添加到搜索路径,则包含./t/foo.h。所以不,. 不会首先被搜索。如果我使用#include "foo.h" 然后,首先搜索本地. 目录。因此,使用-I 添加目录,然后使用#include &lt;your_file.h&gt;(带尖括号),它应该可以工作。

标签: c gcc include-path


【解决方案1】:

您遇到的问题是#include "..." 而不是#include &lt;...&gt;

对于普通的 C 编译器,使用 " 形式总是在与当前文件相同的目录中搜索,然后 然后-I 设置的包含路径中查找。如果您想在查看当前文件的目录之前先搜索其他位置,则没有简单的方法。

你可以使用gcc的-I-禁止在当前文件的目录中搜索,并添加其他目录只用于"包含文件(不适用于&lt;&gt;),但如果你使用它,没有办法恢复在当前文件目录中搜索的行为。

你可以试试这样的:

-ICommon -I. -I- -Iwhatever

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

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

【讨论】:

  • 似乎使用 GCC 的 inlude 选项的灵魂对我来说是一个死胡同,因为如果目录 A 中的源包含目录 B 中的标题,那么“当前文件的目录”非常重要,而目录 B 又是包括目录 B 中的标头。如果 -IB 未添加到选项列表中,但这将在 Makefile 中留下无法维护的长选项列表。这是一个很好的答案,但如果有人想出解决办法,我不会将其标记为已接受的答案!谢谢!
  • 我为我的问题选择的解决方案是使用 Python 脚本克隆所有包含硬件引用的 Halcogen 标头。同样的 Pyhton 脚本也用实际可观察​​的可变变量替换所有硬件地址。该解决方案之所以有效,是因为 Halcogen 层仅在处理器功能和外围设备的使用发生变化时才会发生变化,这在大多数成熟的嵌入式项目中很少见。答案标记为已接受。
猜你喜欢
  • 2022-07-11
  • 2011-03-10
  • 2022-08-02
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-08
相关资源
最近更新 更多