问题描述
最近在 esp-drone
的 github issue 里有两个开发者报了编译不过的问题,本人切到 issue 所描述的 ESP-IDF 版本下,安装对应的工具,始终是编译通过的。并且回忆起八月份的 esp-jumpstart 活动,好像也有一位同学同样的代码,同样的 IDF 环境和工具链,始终会遇到 undefined reference 问题。
- 能够编译通过的 cmake 版本:
cmake --version 3.10.2 + ninja --version 1.8.2
- 无法编译通过的 cmake 版本:
cmake --version 3.16.4 + ninja --version 1.10.0
cmake --version 3.17.2 + ninja --version 1.8.2
解决方法
- 一般遇到
undefined reference
问题是由于没有添加组件的依赖,可以参考 build system 添加一下REQUIRES
- 如果添加了对应组件以后,依然报
undefined reference
,原因是项目的依赖关系比较混乱,出现了依赖顺序问题,或者环形依赖等问题,导致并不是所有依赖都被解析。 - 这种情况下,我们要重新调整依赖关系,甚至要考虑合并某些强依赖的组件,原因可以参考编译系统开发者的回复
临时方法
如果想临时跳过该问题,我们可以在工程的 cmakelist
中打开一个选项 __PROJECT_GROUP_LINK_COMPONENTS
set(__PROJECT_GROUP_LINK_COMPONENTS ON)
打开这个选项会导致库被打包成 group
,会尝试解决所有 undefined reference
问题:
if(__PROJECT_GROUP_LINK_COMPONENTS)
target_link_libraries(${project_elf} "-Wl,--start-group")
endif()
ESP-IDF 在较低版本中默认使用
-group
来管理静态包,在高版本中取消了这个选项,强制开发者处理依赖关系
添加之后,以上版本的 cmake 都能编译通过。。