更新公共库后应用链接失败,同一工程换个目录就找不到头文件,这些现象都可能与工程依赖有关。不过,构建顺序、搜索路径和库版本需要分别检查。Green Hills怎么管理工程依赖Green Hills工程依赖关系出错如何排查,可以从MULTI的工程结构与实际构建命令入手。以下以使用.gpj文件的MULTI工程为例,界面名称以所用版本为准。
一、Green Hills怎么管理工程依赖
工程树中的位置会影响选项继承,但把文件放进树中,并不等于编译器已经知道去哪里查找它。公共源码库、预编译库和外部工程,应采用相应的管理方式。
1、将公共源码建成库工程
公共模块需要随应用一起更新时,适合交给Library工程管理,避免每个应用都维护一份相同源码。
①在Project Manager中选定容纳库的工程节点,点击【Add Item into selected】。
②选择【Library】→【Next】,设置库工程的名称和保存位置。
③点击【Finish】,向库工程添加源文件,核对应用需要使用的库产物。
④选中顶层工程,点击【Build】,检查库的编译、归档以及应用链接是否正常完成。
2、区分预编译库与头文件路径
①使用第三方预编译库时,选中应用工程,通过添加文件操作选择对应库文件,点击【Add】。
②检查编译命令中的头文件搜索路径,确认公共接口所在目录已经包含在内。
③核对库文件的目标处理器、接口版本及编译配置,保存供应方的版本记录。
头文件加入工程树,主要方便浏览和编辑,不会自动改变搜索路径。Green Hills随工具链提供的目标库,应由相应编译选项交给工具链选择,避免手工混入其他配置的文件。
3、让构建系统找到外部工程
库源码位于另一棵工程树时,需要让gbuild找到生成该库的工程。启用隐式依赖分析时,可以通过externalDepends扩展搜索范围。
①检查顶层.gpj或构建配置文件中的externalDepends,确认其指向外部顶层工程的实际位置。
②外部工程存在多种配置时,指定所需配置,核对Debug与Release的对应关系。
③从应用所在的顶层工程发起【Build】,查看外部依赖是否在需要时更新。
externalDepends用于扩展依赖搜索范围,应用仍需正确引用库或对象文件。仅写入外部工程路径,不会自动链接其中的所有产物。
二、Green Hills工程依赖关系出错如何排查
先保留完整输出,找到最早出现的错误。后续的缺文件或未定义符号,可能只是上游构建失败带来的结果。
1、头文件存在却提示找不到
①记录报错源文件和头文件名,检查实际编译命令中的搜索目录及其顺序。
②按工程所在位置核对相对路径,检查目录大小写、路径宏展开结果和文件是否存在。
③对照公共模块版本,确认头文件与库文件来自同一套发布内容。
④重新编译受影响的源文件,确认错误消失后再构建整个应用。
2、库文件存在但没有更新
磁盘上存在库文件,只说明它曾经生成过。应用若引用了复制到其他目录的旧库,源码修改后也可能继续使用旧产物。
①比较链接命令使用的库路径与库工程的实际输出位置。
②单独选中库工程,执行【Build】,查看修改过的源文件是否重新编译、库文件是否更新。
③回到应用工程重新构建,核对链接输入是否为刚生成的库。
3、外部依赖没有自动参与构建
①检查externalDepends中的外部工程路径及配置名称,确认当前环境能够访问。
②检查顶层默认构建选项中是否设置了-nochecklibs;需要隐式依赖分析时,核实关闭原因并调整配置。
③检查目标库的生成工程是否位于隐式依赖分析可搜索的工程结构中。
④重新执行【Build】,从输出确认依赖工程已经参与更新。
隐式依赖分析有搜索范围,也有开关。只调整工程树中的显示顺序,未必能解决依赖未被发现的问题。
4、共享库在不同应用下结果不同
同一个库工程被多个应用引用时,可能从父级继承不同选项。若它们共用输出目录,后一次构建还可能覆盖前一次的产物。
①比较各应用下库工程实际使用的处理器、宏定义、优化及接口相关选项。
②把公共设置放到合适的上层,对库需要固定的选项明确覆盖,检查最终编译命令。
③为存在差异的配置分配独立输出目录,再分别构建,核对应用链接的库路径。
三、Green Hills工程依赖调整后如何验证
一次完整构建成功,还不足以说明增量更新没有遗漏。安排几次小改动,能够直接检查依赖是否生效。
1、验证源码和公共头文件的更新
①先完成一次基准构建,保存编译和链接输出。
②修改公共库中的一处有效实现,点击【Build】,检查相应对象、库和应用是否完成必要更新。
③修改被实际包含的公共头文件,重新构建,观察引用它的源文件是否重编译。
④恢复测试改动并再次构建,确认应用没有继续使用旧产物。
测试应选择参与当前配置的文件。修改未启用模块中的头文件,不能据此判断依赖跟踪失效。
2、确认清理覆盖了外部产物
隐式依赖分析不在清理阶段执行,因此清理应用时,外部依赖产物可能仍然保留。全量验证要覆盖这些生成位置。
①核对应用、公共库和外部工程的输出目录,分别清理所需依赖,或清理能够覆盖它们的父工程。
②从约定的顶层工程重新构建,保留配置、工具链版本和完整日志,检查是否仍依赖手工复制文件。
总结
理解Green Hills怎么管理工程依赖Green Hills工程依赖关系出错如何排查,有助于减少公共模块更新后遗漏编译、误用旧库等问题。MULTI工程拆分之后,源码归属、选项继承和产物位置都要能对应起来,团队成员才能使用相同配置复现结果。日常维护中保留清楚的工程结构和构建记录,比反复清理后重试更便于定位问题。希望这些方法能帮助大家理顺工程之间的关系,让后续修改和协作更省心。如果有Green Hills相关需求,欢迎联系咨询。
