【发布时间】: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<dir> 和-iquote 来重定向包含的标头,使用已弃用的-I- 使GCC 忽略. 目录。但是,我宁愿将我的 Common 文件夹放在 . 之前,而不是一起忽略。添加-I. 似乎不是一回事,我感觉它会扩展到源代码目录并且不会保持“相对”,因为 GCC 会像原来的 . 那样深入研究包含树.
让我的 Python 脚本克隆整个标头,只用变量替换硬件地址,这可能是一个解决方案。然而,仅仅在单独的头文件中重新定义寄存器定义确实不太容易出错。
问题:
还有其他方法可以改变搜索顺序吗?
我已经阅读了几个关于-I- 的问题,但没有一个关于你如何解决这种行为的答案。 This question 非常接近,但与那个用户不同,我没有使用预编译的头文件。
以上有一些假设,如有错误请指正!
【问题讨论】:
-
快速搜索出现了this,除了使用-I 之外的-nostdinc 在这里可能会有所帮助。我将其发布为评论而不是答案,因为我不知道它是否真的回答了您的问题,而且我目前没有方便的 linux 盒子来尝试这个。
-
如果您使用
-I选项添加要搜索的路径,那么您可以使用<>语法在该目录中包含文件,然后预处理器将在添加的搜索路径中查找文件。 -
我不确定我理解你想要什么。我建议您使用 gcc --verbose 进行编译,并为我们提供它为两个版本的 include 输出的搜索路径,以及您提供的命令行参数和您喜欢的搜索路径。 BTW
-I.在调用 gcc 的目录中查找,而 -I- 删除了在包含指令的文件目录中查找的可能性,因此它们确实不同。 -
@JamesH 感谢您的查找,但使用
-nostdinc将删除除.引用之外的所有标准包含路径,使其仍然是第一个要搜索的路径。 -
@Enok82 我刚刚使用 GCC 4.7 版进行了测试,使用了两个头文件
./foo.h和./t/foo.h。如果我在没有任何特殊选项的情况下使用#include <foo.h>,则包含./foo.h。如果我添加了-It以将t目录添加到搜索路径,则包含./t/foo.h。所以不,.不会首先被搜索。如果我使用#include "foo.h"然后,首先搜索本地.目录。因此,使用-I添加目录,然后使用#include <your_file.h>(带尖括号),它应该可以工作。
标签: c gcc include-path