微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PlatformIO collect2.exe 链接器错误:未定义引用

如何解决PlatformIO collect2.exe 链接器错误:未定义引用

我正在尝试通过为库/依赖项创建 git 子模块来模块化我的代码,但我遇到了链接器问题 collect2.exe。我正在 VScode 中使用 PlatformIO 进行编译和构建。

链接错误发生在以下结构中。请注意,为了说明,我简化了名称和结构。

|--include
|--lib
|  |--MyLibFolder
|    |--src
|      |-myLib.h
|      |-myLib.cpp
|    |--ExternalLibFolder
|      |--src
|        |-externalLib.h
|        |-externalLib.cpp
|--src
|  |-main.cpp

地点:

//main.cpp
#include "myLib.h"

//myLib.h
#include "../ExternalLibFolder/src/externalLib.h"
void myTask(void * parameter);

//myLib.cpp
#include "myLib.h"
void myTask(void * parameter) {
  aClass myClass(someVal);
  myClass.init();

  while(1) {
    //blah
  }
}

//externalLib.h
class aClass :anInheritance{
  aClass(someType parameter);
  void inti();
}

//externalLib.cpp
aClass::aClass(someType parameter){}
void aClass::init() {
  anInheritance::begin();
}

此结构返回以下错误

In function `MyTask()`
myLib.cpp:(.text._....): undefined reference to `aClass::aClass(someType &)'
myLib.cpp:(.text._....): undefined reference to `aClass::init()'
collect2.exe: error: ld returned 1 exit status
***[.pio\build\teensy41\firmware.elf] Error 1

注意:当我将所有源文件放入 lib/MyLibFolder/src 文件夹时,程序将运行并完美编译。或者,如果我将每个子模块都放在 lib/ 文件夹下,那么程序也可以正常运行。只有当我以递归方式将代码拆分为子模块时,才会出现此问题。

我不知道如何解决这个链接器问题,任何帮助都会很棒

解决方法

为了使构建成功,必须将以下两行添加到 platformio.ini 文件中:

lib_extra_dirs = lib/MyLibFolder/ExternalLibFolder
lib_ldf_mode = chain+

我在调试时发现一件非常奇怪的事情,对此我没有答案。我正在运行 FreeRTOS,真正奇怪的是程序在以下情况下成功构建:

  1. 我从 platformio.ini 文件中删除了 lib_ldf_mode = chain+
  2. loop() 看起来像这样:
void loop() {
  /*
  #include externalLib.h
  */
}

当我从 loop() 中删除 /* #include externalLib.h */ 行或将其更改为 //#include externalLib.h 后,链接器再次遇到问题。然后我不得不将 lib_ldf_mode = chain+ 行添加到 platformio.ini。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。