3

我正在为 MSP430 使用 IAR Embedded Workbench 5.51。我正在使用 C99。

我正在尝试包含来自第三方库的代码。我已经在我的主项目目录的子目录中复制了这个第三方库的目录结构。但是,当我尝试编译时,我得到了一堆

致命错误 [Pe1696]:无法打开源文件“ThirdPartyLib/Subdir/file.h”

但是在日志中 IAR 显示:

搜索到:“C:\ ... bla bla bla ... \Source\ThirdPartyLib\Subdir\”

这个库中每个源文件中的 include 语句都是这样的:

#include "ThirdPartyLib/Subdir/someheader.h"

我试图通过以下方式添加到 C 预处理器的路径:

项目 -> 选项 -> C/C++ 编译器 -> 预处理器

并添加行:

$PROJ_DIR$\ThirdPartyLib\
$PROJ_DIR$\ThirdPartyLib\Subdir\
$PROJ_DIR$\ThirdPartyLib\Utils\

我没有选中“多文件编译”。

所有有问题的源文件都已添加到项目中。我创建了组来模仿库的目录结构。

如果我将路径从绝对路径更改为相对路径,例如

#include "somelocalheader.h"
#include "../Utils/someotherheader.h"

但我正在处理大量文件,并希望尽可能少地修改它们。

我以前从来没有遇到过这个问题 - 有没有人知道为什么会发生这种情况。是否有一个简单的解决方法,所以我不必清理每个 c 文件中的每个包含语句?

这基本上就是我的目录树的样子:

  • 来源
    • 调试
      • 可执行程序
        • 输出.d43
      • 列表
        • blabla.map
      • 对象
        • ...
    • 释放
      • ...
    • 设置
      • ...
    • 第三方库
      • 子目录
        • ... 第三方代码文件住在这里 ...
      • 实用程序
        • ... 更多第三方代码文件住在这里 ...
    • ...我的代码与 EWP、EWW 等一起存在于此...

编辑#2:我将 ThirdPartyLib 的目录上移了一个级别,因为我在 /Source/ 上递归地运行 doxygen,我意识到它永远需要 doxygen,而且该库有自己的 API。

无论如何,这是现在的结构:

  • 工作副本
    • 来源
      • 调试
        • 可执行程序
          • 输出.d43
        • 列表
          • blabla.map
        • 对象
          • ...
      • 释放
        • ...
      • 设置
        • ...
      • ...我的代码与 EWP、EWW 等一起存在于此...
    • 第三方库
      • 子目录
        • ... 第三方代码文件住在这里 ...
      • 实用程序
        • ... 更多第三方代码文件住在这里 ...

我已经为 ThirdPartyLib 添加了一个组,其中包含两个子组 SubDir 和 Utils,并将 Subdir 和 Utils 目录中的所有文件添加到相应的子组中。

现在我试图再次编译它,我再次面临 Pe1696 错误。IAR 说:

searched: "C:\...\Working Copy\ThirdPartyLib\SubDir"

然而它仍然没有找到文件。

我参考了这篇文章: http ://e2e.ti.com/support/low_power_rf/f/155/t/110195.aspx 我不确定它是否完全相关,因为我所包含的目录似乎没有'掉出来'。IAR 显然正在搜索这些文件。

但是我还是尝试将以下几行添加到预处理器中

$PROJ_DIR$\..\ThirdPartyLib\SubDir
$PROJ_DIR$\..\ThirdPartyLib\utils

这似乎没有帮助。我在消息日志中得到这些额外的行:

searched: "C:\...\Working Copy\Source\..\ThirdPartyLib\SubDir\"
searched: "C:\...\Working Copy\Source\..\ThirdPartyLib\Utils\"

编辑#3 我尝试将 EWW/EWP 提升到“工作副本”,然后读取所有组和所有文件......没有骰子。我在这里迷路了。最令人沮丧的部分是同一个库是在另一个项目中实现的,该项目是由一些前开发人员完成的,我试图以同样的方式包含它。我知道这将是一件微不足道的事情,我只是不知道是什么。

4

1 回答 1

3

如果#include库中的所有引用都是形式的#include "ThirdPartyLib/Subdir/file.h",那么所在的根目录ThirdPartyLib应该在预处理器包含路径中。

如果你的目录结构是:

C:\My Project\Source
             \ThirdPartyLib

那么C:\My Project预计会在预处理器包含路径中。

当编译器搜索包含文件时,它将依次加入,每个包含搜索路径与#include指令中列出的路径,直到找到匹配的文件。

于 2013-07-10T23:27:45.097 回答