4

How can I include libraries not contained in any direct subdirectories of a sketch, using the Arduino IDE?

I want my project structure to look like this:

Project
└> MCUa
   └> MCUa.ino
└> MCUb
   └> MCUb.ino
└> Libraries
   └> TimerLib
      └> TimerLib.cpp
      └> TimerLib.h

So in my project two sketches MCUa and MCUb share a resource, namely the library TimerLib.

I've tried to include the libraries like this:

#include "../Libraries/TimerLib/TimerLib.h"

or this:

#include "./../Libraries/TimerLib/TimerLib.h"

But none of them will compile - this is the error message:

fatal error: ./../Libraries/TimerLib/TimerLib.h: No such file or directory
 #include "./../Libraries/TimerLib/TimerLib.h"
                                              ^
compilation terminated.
exit status 1
Error compiling.

If I put the library directly in of the directories and reference it like this:

#include "./Libraries/TimerLib/TimerLib.h"

Everything goes well.

Using an absolute path like in this answer is not a possibility in this case, as it should compile out of the box for others, without modifying any absolute paths.

  • Did you try #include <TimerLib.h>? Add to sketch and in source of TimerLib. – Mikael Patel Sep 28 '16 at 9:46
  • @MikaelPatel If I put the TimerLib in the "global" Arduino directory, yes, that works. But I don't think I understand your comment/suggestion? What should be added to the source of TimerLib? – Clausen Sep 28 '16 at 9:51
2

The problem with a relative path for an include is that it has to be relative to one of the predefined list of existing include directories. This includes:

  • Compiler include locations
  • The Arduino core files
  • The locations of other included libraries
  • The build folder for the sketch

What it does not include is the location of the sketch, so you cannot specify a location relative to the sketch itself.

Further, even if you could, the compiler wouldn't know what library it was supposed to be referencing so, while the header would be found, any source files associated with it would be ignored and linking would fail miserably.

Instead you will have to place the library in a standard library location, such as the libraries folder in your sketch book.

  • 1
    Ok, but why does #include "./Libraries/TimerLib/TimerLib.h" then work? That is relative to the sketch? I probably just don't understand completely how the compiler searches for libraries. – Clausen Sep 28 '16 at 9:54
  • I suspect that it is being copied to the build folder along with the rest of the files in the sketch. – Majenko Sep 28 '16 at 9:55

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.