adafruit / Adafruit_SPIFlash

Arduino library for external (Q)SPI flash device
MIT License
157 stars 84 forks source link

undefined reference to `Adafruit_FlashTransport_QSPI::Adafruit_FlashTransport_QSPI()' #116

Closed cantonfoshan closed 10 months ago

cantonfoshan commented 2 years ago

Operating System

MacOS

IDE version

1.8.13

Board

AdaFruit e-ink sd card

BSP version

2.13

SPIFlash Library version

1.5.1

Sketch as attached file if not stock example

Adafruit_FlashTransport_QSPI flashTransport; Adafruit_SPIFlash flash(&flashTransport); FatFileSystem fatfs;

What happened ?

it gives this error

undefined reference to `Adafruit_FlashTransport_QSPI::Adafruit_FlashTransport_QSPI()'

When the class is already there

public: Adafruit_FlashTransport_QSPI(int8_t pinSCK, int8_t pinCS, int8_t pinIO0, int8_t pinIO1, int8_t pinIO2, int8_t pinIO3); Adafruit_FlashTransport_QSPI(void);

virtual void begin(void); virtual void end(void);

virtual bool supportQuadMode(void) { return true; }

virtual void setClockSpeed(uint32_t write_hz, uint32_t read_hz);

virtual bool runCommand(uint8_t command); virtual bool readCommand(uint8_t command, uint8_t response, uint32_t len); virtual bool writeCommand(uint8_t command, uint8_t const data, uint32_t len);

virtual bool eraseCommand(uint8_t command, uint32_t address); virtual bool readMemory(uint32_t addr, uint8_t data, uint32_t len); virtual bool writeMemory(uint32_t addr, uint8_t const data, uint32_t len); };

How to reproduce ?

Try to compile this code

Adafruit_FlashTransport_QSPI flashTransport; Adafruit_SPIFlash flash(&flashTransport); FatFileSystem fatfs;

Debug Log as attached txt file

No response

Screenshots

No response

ladyada commented 2 years ago

what is the microcontroller board

hathach commented 2 years ago

also please provide

  1. the exact board you are using and
  2. attached compile-able sketch as txt file
  3. attached arduino compile log as txt file
ricardo192 commented 2 years ago

I have this same exact issue, using MacOS, with the itsy bitsy m4, using platformIO, this happens with every time I try to define the object Adafruit_FlashTransport_QSPI and the error is

/Users/ricardo/.platformio/packages/toolchain-gccarmnoneeabi/bin/../lib/gcc/arm-none-eabi/9.3.1/../../../../arm-none-eabi/bin/ld: .pio/build/adafruit_itsybitsy_m4/src/main.cpp.o: in function `_GLOBAL__sub_I_flashTransport':
main.cpp:(.text.startup._GLOBAL__sub_I_flashTransport+0x8): undefined reference to `Adafruit_FlashTransport_QSPI::Adafruit_FlashTransport_QSPI()'
collect2: error: ld returned 1 exit status
*** [.pio/build/adafruit_itsybitsy_m4/firmware.elf] Error 1
hathach commented 2 years ago

can you try to compile to see if it compile with Arduino IDE instead of PIO ?

ricardo192 commented 2 years ago

Sure, but it's the same compiler and same code so it shouldn't make a difference.

ricardo192 commented 2 years ago

weird, it compiles in Arduino IDE

ladyada commented 2 years ago

we agree... but the CI test works great here https://github.com/adafruit/Adafruit_SPIFlash/actions so there is evidence that it works in arduino and not in PIO cc @ivankravets

hathach commented 2 years ago

@ricardo192 PIO parser may or may not pick up the same CFlags as Arduino, which does affect the compiling process. So you need to check if PIO parser does it job, and/or need to manual add config if needed.

valeros commented 2 years ago

Hi @ricardo192! It's strange, but I cannot reproduce the issue. Could you please provide a minimal but complete PlatformIO project to reproduce the issue?

ricardo192 commented 2 years ago

teststuf copy.zip @valeros

valeros commented 2 years ago

@ricardo192 In a nutshell, PlatformIO supports many types of libraries, including Arduino ones. For some reason you decided to manually add the Adafruit SPIFlash library to the lib folder of your project instead of specifying it as dependency in your platformio.ini. At the same time, you also changed the structure of the library (moved the source files from the src folder to the root of the library). This change you made forced PlatformIO to handle the flash library in your project as a generic library and hence omit special compilation logic required for the Arduino libraries.

To fix the problem you can either specify the library as a dependency, for example as a Git repository with a specific tag:

[env:adafruit_itsybitsy_m4]
platform = atmelsam
framework = arduino
board = adafruit_itsybitsy_m4
lib_deps = 
    https://github.com/adafruit/Adafruit_SPIFlash#3.11.0

or just move the library sources to the src folder, e.g. lib/flash/src/Adafruit_SPIFlash.cpp

ricardo192 commented 2 years ago

@valeros My bad! I have been doing this for a long while now (for at least like 20 Arduino libraries) and not have had a single issue with it until just now. also. I only just now got it to compile when I used the library manager. and doing it in the lib folder 'properly' still doesn't work for some reason. thanks for the help!

hathach commented 10 months ago

closed, this is caused by pio config rather than the library itself

skyswordx commented 2 months ago

when I try to run the example flash_info, the same error happens while linking

Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/ststm32/genericSTM32H750VB.html
PLATFORM: ST STM32 (17.4.0) > STM32H750VBT6 (1024k RAM. 128k Flash)
HARDWARE: STM32H750VBT6 480MHz, 1MB RAM, 128KB Flash
DEBUG: Current (stlink) External (blackmagic, jlink, stlink)
PACKAGES:
 - framework-arduinoststm32 @ 4.20701.0 (2.7.1)
 - framework-cmsis @ 2.50900.0 (5.9.0)
 - toolchain-gccarmnoneeabi @ 1.120301.0 (12.3.1)
LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 15 compatible libraries
Scanning dependencies...
Dependency Graph
|-- Adafruit SPIFlash @ 4.3.4+sha.160b5ff
|-- SdFat - Adafruit Fork @ 2.2.3
|-- SPI @ 1.1.0
Building in release mode
Compiling .pio\build\genericSTM32H750VB\src\main.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\FatLib\FatName.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\FatLib\FatPartition.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\FatLib\FatVolume.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\FreeStack.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\FsLib\FsFile.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\FsLib\FsNew.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\FsLib\FsVolume.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\MinimumSerial.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\SdCard\SdCardInfo.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\SdCard\SdSpiCard.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\SdCard\SdioTeensy.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\SpiDriver\SdSpiArtemis.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\SpiDriver\SdSpiChipSelect.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\SpiDriver\SdSpiDue.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\SpiDriver\SdSpiESP.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\SpiDriver\SdSpiParticle.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\SpiDriver\SdSpiSTM32.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\SpiDriver\SdSpiSTM32Core.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\SpiDriver\SdSpiTeensy3.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\common\FmtNumber.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\common\FsCache.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\common\FsDateTime.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\common\FsName.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\common\FsStructs.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\common\FsUtf.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\common\PrintBasic.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\common\upcase.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\iostream\StdioStream.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\iostream\StreamBaseClass.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\iostream\istream.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib7c6\SdFat - Adafruit Fork\iostream\ostream.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib40a\Adafruit SPIFlash\Adafruit_FlashCache.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib40a\Adafruit SPIFlash\Adafruit_SPIFlash.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib40a\Adafruit SPIFlash\Adafruit_SPIFlashBase.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib40a\Adafruit SPIFlash\esp32\Adafruit_FlashTransport_ESP32.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib40a\Adafruit SPIFlash\qspi\Adafruit_FlashTransport_QSPI_NRF.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib40a\Adafruit SPIFlash\qspi\Adafruit_FlashTransport_QSPI_SAMD.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib40a\Adafruit SPIFlash\rp2040\Adafruit_FlashTransport_RP2040.cpp.o
Compiling .pio\build\genericSTM32H750VB\lib40a\Adafruit SPIFlash\spi\Adafruit_FlashTransport_SPI.cpp.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\HardwareSerial.cpp.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\IPAddress.cpp.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\Print.cpp.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\RingBuffer.cpp.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\Stream.cpp.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\Tone.cpp.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\USBSerial.cpp.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\VirtIOSerial.cpp.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\WInterrupts.cpp.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\WMath.cpp.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\WSerial.cpp.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\WString.cpp.o
Archiving .pio\build\genericSTM32H750VB\lib7c6\libSdFat - Adafruit Fork.a
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\abi.cpp.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\avr\dtostrf.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\board.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\core_debug.c.o
Archiving .pio\build\genericSTM32H750VB\lib40a\libAdafruit SPIFlash.a
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\hooks.c.o
Indexing .pio\build\genericSTM32H750VB\lib7c6\libSdFat - Adafruit Fork.a
Indexing .pio\build\genericSTM32H750VB\lib40a\libAdafruit SPIFlash.a
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\itoa.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\main.cpp.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\pins_arduino.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\libmetal\device.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\libmetal\generic\condition.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\libmetal\generic\cortexm\sys.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\libmetal\generic\generic_device.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\libmetal\generic\generic_init.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\libmetal\generic\generic_io.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\libmetal\generic\generic_shmem.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\libmetal\generic\time.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\libmetal\init.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\libmetal\io.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\libmetal\log.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\libmetal\shmem.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\mbox_ipcc.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\open-amp\remoteproc\remoteproc_virtio.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\open-amp\rpmsg\rpmsg.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\open-amp\rpmsg\rpmsg_virtio.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\openamp.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\rsc_table.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\virt_uart.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\virtio\virtio.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\virtio\virtqueue.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\virtio_buffer.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\OpenAMP\virtio_log.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\startup_stm32yyxx.S.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\usb\cdc\cdc_queue.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\usb\cdc\usbd_cdc.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\usb\cdc\usbd_cdc_if.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\usb\hid\usbd_hid_composite.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\usb\hid\usbd_hid_composite_if.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\usb\usb_device_core.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\usb\usb_device_ctlreq.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\usb\usb_device_ioreq.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\usb\usbd_conf.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\usb\usbd_desc.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\usb\usbd_ep_conf.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\stm32\usb\usbd_if.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\wiring_analog.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\wiring_digital.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\wiring_pulse.cpp.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\wiring_shift.c.o
Compiling .pio\build\genericSTM32H750VB\FrameworkArduino\wiring_time.c.o
Archiving .pio\build\genericSTM32H750VB\libFrameworkArduino.a
Indexing .pio\build\genericSTM32H750VB\libFrameworkArduino.a
Linking .pio\build\genericSTM32H750VB\firmware.elf
c:/users/11405/.platformio/packages/toolchain-gccarmnoneeabi/bin/../lib/gcc/arm-none-eabi/12.3.1/../../../../arm-none-eabi/bin/ld.exe: warning: .pio/build/genericSTM32H750VB/firmware.elf has a LOAD segment with RWX permissions
c:/users/11405/.platformio/packages/toolchain-gccarmnoneeabi/bin/../lib/gcc/arm-none-eabi/12.3.1/../../../../arm-none-eabi/bin/ld.exe: .pio/build/genericSTM32H750VB/src/main.cpp.o: in function `_GLOBAL__sub_I_flashTransport':
main.cpp:(.text.startup._GLOBAL__sub_I_flashTransport+0x2): undefined reference to `Adafruit_FlashTransport_QSPI::Adafruit_FlashTransport_QSPI()'
collect2.exe: error: ld returned 1 exit status
*** [.pio\build\genericSTM32H750VB\firmware.elf] Error 1
======================================================= [FAILED] Took 18.32 seconds =======================================================

 *  The terminal process "C:\Users\11405\.platformio\penv\Scripts\platformio.exe 'run'" terminated with exit code: 1. 
 *  Terminal will be reused by tasks, press any key to close it

here are the files I complie header file

#ifndef FLASH_CONFIG_H_
#define FLASH_CONFIG_H_

// Un-comment to run example with custom SPI and SS e.g with FRAM breakout
// #define CUSTOM_CS   A5
// #define CUSTOM_SPI  SPI

#if defined(CUSTOM_CS) && defined(CUSTOM_SPI)
Adafruit_FlashTransport_SPI flashTransport(CUSTOM_CS, CUSTOM_SPI);

#elif defined(ARDUINO_ARCH_ESP32)
// ESP32 use same flash device that store code for file system.
// SPIFlash will parse partition.cvs to detect FATFS partition to use
Adafruit_FlashTransport_ESP32 flashTransport;

#elif defined(ARDUINO_ARCH_RP2040)
// RP2040 use same flash device that store code for file system. Therefore we
// only need to specify start address and size (no need SPI or SS)
// By default (start=0, size=0), values that match file system setting in
// 'Tools->Flash Size' menu selection will be used.
Adafruit_FlashTransport_RP2040 flashTransport;

// To be compatible with CircuitPython partition scheme (start_address = 1 MB,
// size = total flash - 1 MB) use const value (CPY_START_ADDR, CPY_SIZE) or
// subclass Adafruit_FlashTransport_RP2040_CPY. Un-comment either of the
// following line:
//  Adafruit_FlashTransport_RP2040
//    flashTransport(Adafruit_FlashTransport_RP2040::CPY_START_ADDR,
//                   Adafruit_FlashTransport_RP2040::CPY_SIZE);
//  Adafruit_FlashTransport_RP2040_CPY flashTransport;
#else

// On-board external flash (QSPI or SPI) macros should already
// defined in your board variant if supported
// - EXTERNAL_FLASH_USE_QSPI
// - EXTERNAL_FLASH_USE_CS/EXTERNAL_FLASH_USE_SPI
#define EXTERNAL_FLASH_USE_QSPI

#if defined(EXTERNAL_FLASH_USE_QSPI)
Adafruit_FlashTransport_QSPI flashTransport;

#elif defined(EXTERNAL_FLASH_USE_SPI)
Adafruit_FlashTransport_SPI flashTransport(EXTERNAL_FLASH_USE_CS,
                                           EXTERNAL_FLASH_USE_SPI);

#elif defined(__AVR__) || defined(ARDUINO_SAMD_CIRCUITPLAYGROUND_EXPRESS)

// Circuit Playground Express built with Arduino SAMD instead of Adafruit SAMD
// core or AVR core Use stand SPI/SS for avr port. Note: For AVR, cache will be
// disable due to lack of memory.
Adafruit_FlashTransport_SPI flashTransport(SS, SPI);

#else
#error No (Q)SPI flash are defined for your board !
#endif

#endif

#endif

and source file

#include <Arduino.h>
#include <SPI.h>
#include <SdFat.h>

#include <Adafruit_SPIFlash.h>

// for flashTransport definition
#include "flash_config.h"

void setup() {
  // put your setup code here, to run once:
    Serial.begin(115200);

}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.println("Hello World! stm32duino is working!");
}

here is my pio config file

[platformio]

[env:genericSTM32H750VB]
platform = ststm32
board = genericSTM32H750VB
framework = arduino
debug_tool = stlink
upload_protocol = stlink

lib_deps = 
    https://github.com/adafruit/Adafruit_SPIFlash.git
skyswordx commented 2 months ago

@ricardo192 PIO parser may or may not pick up the same CFlags as Arduino, which does affect the compiling process. So you need to check if PIO parser does it job, and/or need to manual add config if needed. My apologies for the interruption. I am new to using PIO and was wondering what configuration I should add to make a manual call.