我正在为嵌入式项目整理测试环境。由于它是一个嵌入式项目,它试图访问硬件寄存器,例如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非常接近,但与该用户不同,我没有使用预编译的标头。
上面有一些假设,请纠正我,如果他们错了!
答案 0 :(得分:4)
您遇到的问题是"
... #include <
而不是>
... "
使用普通的C编译器时,使用-I
表单始终在与当前文件相同的目录中搜索,然后在-I-
设置的包含路径中查找。如果你想在查看当前文件的目录之前搜索其他地方,那么就没有简单的方法了。
您可以使用gcc的"
来禁止在当前文件的目录中搜索,并添加其他目录以仅用于<>
包含文件(不适用于-ICommon -I. -I- -Iwhatever
),但如果您使用该文件,则无法恢复在当前文件目录中搜索的行为。
您可以尝试以下内容:
"
这将首先在Common
中搜索whatever
,然后在当前工作目录中搜索<>
(以及正常路径的其余部分),而{{1} }将从whatever
开始。不幸的是,它永远不会在当前文件的目录中搜索,如果它与当前工作目录不同。
-I-
也已弃用,因此很快就会消失。