Workbench - Can't link?

Small sketch that works fine in the web IDE, but I’ve spent the better part of today setting up VSCode and P. Workbench (and reading tutorials and watching tutorials), but I can’t seem to get past the following error. I’ve rebuilt the environment a couple of times and done a “Clean”. I’ve tried with both the latest firmware as well as an older one, but the results remain the same. I’ve tried using both a .cpp and .ino extension, which causes differences in the compilation, but still throws the same errors. I see the error regarding CellularHelper.o, but no clue as to why this is being thrown. What am I missing?

Executing task in folder AQI_Boron_Project: make -f ‘/Users/Chuck_Allen/.particle/toolchains/buildscripts/1.9.2/Makefile’ compile-user -s <


Creating /Users/Chuck_Allen/Dropbox/Arduino/#Capstone/#Boron_Code/AQI_Boron_Project/target/2.0.0-rc.4/boron/platform_user_ram.ld …
arm-none-eabi-gcc: warning: /Users/Chuck_Allen/Dropbox/Arduino/: linker input file unused because linking not done
/Users/Chuck_Allen/.particle/toolchains/gcc-arm/9.2.1/bin/…/lib/gcc/arm-none-eabi/9.2.1/…/…/…/…/arm-none-eabi/bin/ar: …/build/target/user/platform-13-m/AQI_Boron_Project/CellularHelper/src/CellularHelper.o: No such file or directory**
make[3]: *** […/build/target/user/platform-13-m/AQI_Boron_Project/libuser.a] Error 1
make[2]: *** [user] Error 2
make[1]: *** [modules/boron/user-part] Error 2
make: *** [compile-user] Error 2
The terminal process “/bin/bash ‘-c’, ‘make -f ‘/Users/Chuck_Allen/.particle/toolchains/buildscripts/1.9.2/Makefile’ compile-user -s’” terminated with exit code: 2.

Have you created the project via the dedicated Workbench task?


How have you imported the libraries (if you use any)?

Thanks for the quick reply.

Yes to both.

There’s only one imported library, being CellularHelper.

It shows up in the lib tab under src (both .h and .cpp) as I would expect.

The “includes” in the source show no errors or warnings.

For me this seems to work (in Windows and WSL2/Ubuntu)

What I did

  1. Particle: Create New Project
  2. select the correct platform (boron) and target version (deviceOS@2.0.0-rc.4) via the status bar image
    (can also be done via Particle: Configure Project for Device)
  3. Particle: Install Library -> CellularHelper
  4. copy code from lib/CellularHelper/Examples/1-simple/1-simple.cpp to the project’s .ino file in src
  5. Particle: Compile application (local)

and this is what I got

Maybe try to delete the entire target folder in your project and build again.

This is frustrating.

I created a new project (testProject).

I copied the example code (first example) from the CellularHelper GIT into the stub sketch and complied.

Got the expected error - no library.

I installed the library using Particle: Install Library - which worked as expected.

I selected the platform and target version (same as yours).

I recompiled:

This is what the panel looks like:

Can you try a different folder that does not reside in a Dropbox folder?

Maybe it’s also time to pin @m_m

Well that makes even less sense to me.

I’m using local folders and files that just happen to be replicated through DB. I’ve been using all my dev stuff that way for years too.

…… BUT……

I created a new project in a non-DB folder and copied my code into the src and added the library and……

So…… I’ll pursue it this way and try and figure out later why using folders that are in my DB folder seemingly has an issue.

Thanks much

In your original path you had some #’s:


AFAIK there are many times in the internal Makefiles where the build path is used unescaped, having issues with paths containing spaces and mangling non-ascii characters. Since # would signify a comment, I’m willing to bet your path was improperly interpreted by the Makefiles.

Could you try using your dropbox folder but not have any #’s in the project name or the path?

1 Like

Now that you mention it… I ran up against this a couple of years ago - different issue though, but the solution was eliminating (or escaping - can’t remember which) the #-signs. I’ll bet you’re right. I can test it later as I’ve now got a different problem, which I will add onto here for now.

I was successful in uploading via local USB, but the Boron got into some weird state and since then, I’ve spent two hours trying to get it back to normal… I have a blinking blue, no matter what I try. I can do a local Flash though, but it won’t do anything after the “successful” message. I can run Particle Identify and I get the right stuff back. I wrote a simple script to do nothing but connect to the cloud, but it never even gets to my Serial.print commands… I’ve tried the button reset and “particle flash --usb tinker” in DFU mode (success), but all I end up with is a blinking Blue light (listening mode). Code follows:

#include "Particle.h"
#define EXPIRED_TIMER(tmr)   (millis() >= tmr)
#define SET_TIMER(tmr, dur)  (tmr = millis() + dur)
#define _SECONDS            (1000)
uint32_t cxnFailedTimer = 0;
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//  Connect to Particle Cloud
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bool connectToCloud()
    SET_TIMER(cxnFailedTimer, (10 * _SECONDS));
    while (!Particle.connected() && ! EXPIRED_TIMER(cxnFailedTimer))
        return true;
    } else {
        return false;

void setup() {
        Serial.begin(115200);               // Opens up a Serial port
        waitFor(Serial.isConnected, 5000);  // Waits 5 seconds for it
            Serial.print("Init:\tCloud connection successful\n");
        } else {
            Serial.print("Init:\tCloud connection Failed. Retrying.......\n");
                Serial.print("Init:\tCloud connection Failed after retry\n");

// loop() runs over and over again, as quickly as it can execute.
void loop() {
  // The core of your code will likely live here.

For one I’d remove your timer defines and use this instead

  if (waitFor(Particle.connected, 10s)) 

However, with your device blinking blue I suppose it was never fully setup or the SIM hasn’t been activated (has been deactivated).

You could try particle usb setup-done to set the setup-done flag and see whether that changes anything.

If that doesn’t help, you can flash this to your device and see what that shows

BTW, millis() timing is better done this way

  if (mills() - lastTime > setCadence)

The “setup-done” command worked………
I’ll add this to my notes for how to recover from various states.

The waitFor throws errors.

It doesn’t seem to like the 10s. When I changed it to 10000, it compiled fine.

/Users/Chuck_Allen/Developer/ParticleProjects/InitProject/init_01/src/init_01.ino:18:23: error: ‘class CloudClass’ has no member named ‘isConnected’; did you mean ‘disconnected’?
18 | waitFor(Particle.isConnected, 10s);

We are replacing the Adafruit FONA with the Boron in a large Air Quality reporting network here in Central Oregon.

The Boron and the Particle Cloud provide a far superior way to implement for cellular, once I get past all these teething issues.

I’ve developed for Arduino platform devices for years, but the Particle devices, although similar, certainly have their own universe of behaviors.

Thanks again for your assistance.

What device OS version are you targeting?
Since 1.5.0 Chrono Literals should be supported.

However, your error message mentions isConnected which doesn’t exist and I didn’t write :wink:

I’m using 2.0.0-rc.4

If I replace the 10s with a literal (or a #define) it works correctly.

In any case, I’m no longer stalled and can resume testing which is very helpful.

I know you respond to a lot of issues on this BBS - some simple (like mine) and others that are much more complex.

I hope you realize how valuable and appreciated your input is to the many of us who are trying to get up to speed or are blocked by a Particle issue.

Thanks again for the time you contribute to the community.

waitFor(Particle.connected, 10s); //CXN_FAIL_TIME);