我正在使用适用于 MSP430 的 IAR 嵌入式工作台 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 文件中的每个包含语句?
这基本上就是我的目录树的样子:
编辑#2: 我将 ThirdPartyLib 的目录上移了一个级别,因为我在 /Source/ 上递归运行 doxygen,并且我意识到它永远需要 doxygen,而且该库有自己的 API。
无论如何,现在的结构是这样的:
我已将一个组添加回我的 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 上移到“工作副本”,然后读取所有组和所有文件......没有骰子。我在这里迷路了。最令人沮丧的部分是,同一个库是在由一些前开发人员完成的另一个项目中实现的,我试图以相同的方式包含它。我知道这将是一件微不足道的事情,我只是不知道是什么。
如果库内的所有
#include
引用都是#include "ThirdPartyLib/Subdir/file.h"
形式,那么ThirdPartyLib
所在的根目录应该位于预处理器包含路径中。
如果您的目录结构是:
C:\My Project\Source
\ThirdPartyLib
那么
C:\My Project
预计将位于预处理器包含路径中。
当编译器搜索包含文件时,它会依次将每个包含搜索路径与
#include
指令中列出的路径连接起来,直到找到匹配的文件。
其他包含目录应在两个地方更改:
在“C/C++ 编译器”中和
在“汇编器”中
项目 -> 选项 -> C/C++ 编译器 -> 预处理器 -> 其他包含目录:(每行一个):
$PROJ_DIR$..\ThirdPartyLib\SubDir $PROJ_DIR$..\ThirdPartyLib\utils
$PROJ_DIR$..\ThirdPartyLib\SubDir $PROJ_DIR$..\ThirdPartyLib\utils