【填坑】ESP-IDF 工程编译出现 undefined reference 问题

问题描述

最近在 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

解决方法

  1. 一般遇到 undefined reference 问题是由于没有添加组件的依赖,可以参考 build system 添加一下 REQUIRES
  2. 如果添加了对应组件以后,依然报 undefined reference ,原因是项目的依赖关系比较混乱,出现了依赖顺序问题,或者环形依赖等问题,导致并不是所有依赖都被解析。
  3. 这种情况下,我们要重新调整依赖关系,甚至要考虑合并某些强依赖的组件,原因可以参考编译系统开发者的回复

临时方法

如果想临时跳过该问题,我们可以在工程的 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 都能编译通过。。

你可能感兴趣的:(ESP系列物联网开发教程,esp32,esp32s2,esp-idf,cmake)