让 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-
也已弃用,因此可能很快就会消失。
背景:
我正在为一个嵌入式项目构建一个测试环境。由于它是一个嵌入式项目,它会尝试访问硬件寄存器,例如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-
也已弃用,因此可能很快就会消失。