C++ PlatformIO collect2.exe链接器错误:未定义对的引用
我试图通过为库/依赖项装入git子模块来模块化代码,但我遇到了链接器问题C++ PlatformIO collect2.exe链接器错误:未定义对的引用,c++,linker,platformio,C++,Linker,Platformio,我试图通过为库/依赖项装入git子模块来模块化代码,但我遇到了链接器问题collect2.exe。我正在VScode中使用PlatformIO编译和构建 链接错误发生在以下结构中。请注意,为了便于说明,我简化了名称和结构 |--include |--lib | |--MyLibFolder | |--src | |-myLib.h | |-myLib.cpp | |--ExternalLibFolder | |--src | |-exte
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"
及
及
此结构返回以下错误:
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,真正奇怪的是,程序在以下情况下成功构建:
lib\u ldf\u mode=chain+
行当我从loop()中删除
/*#include externalLib.h*/
行或将其更改为/#include externalLib.h
时,链接器再次遇到问题。然后我不得不将lib\u ldf\u mode=chain+
行添加到platformio.ini中。您显示了aClass
函数的声明,但是定义(它们的实现)在哪里?您是否使用定义(实现)所在的源文件进行构建?实际上,您应该会遇到另一个错误,因为aClass myClass(someType someVal)
声明了一个名为myClass
的函数,而不是aClass
对象。请原谅,我最近才了解链接器和编译器,但如果我理解正确的话;aClass在函数myMethod中定义。请允许我详细说明你的第二个问题(构建源文件…?)不确定当前错误是否掩盖了另一个错误,但在这个阶段只有上述错误。现在,你如何构建你的项目?你是如何建立图书馆的?你如何建立你的程序?你如何与图书馆联系?
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_extra_dirs = lib/MyLibFolder/ExternalLibFolder
lib_ldf_mode = chain+
void loop() {
/*
#include externalLib.h
*/
}