I have a simple C library that looks like this:
//mycLib.h
#ifndef _MY_C_LIB_h
#define _MY_C_LIB_h
typedef struct {char data1;
int data2;
} sampleStruct;
extern void mycLibInit(int importantParam);
extern void mycLibDoStuff(char anotherParam);
extern void sampleStruct mycLibGetStuff();
#endif
//mycLib.c
sampleStruct _sample;
void mycLibInit(int importantParam)
{
//init stuff!
//lets say _sample.data2 = importantParam
}
void mycLibDoStuff(char anotherParam)
{
//do stuff!
//lets say _sample.data1 = anotherParam
}
sampleStruct mycLibGetStuff()
{
//return stuff,
// lets say return _sample;
}
It works well when called from other test software. However, as part of another project, I have to include it in an Arduino project and compile it to work on that platform as well. Unfortunately, When I run my Arduino code that looks like this:
#include <mycLib.h>
void setup()
{
mycLibInit(0);
}
void loop()
{
}
I get the following compile error:
code.cpp.o: In function setup':
C:\Program Files (x86)\Arduino/code.ino:6: undefined reference to
mycLibInit(int)'
I have read following threads on Arduino website:
but in all those cases the external library was in form of a c++ class with a constructor call in the Arduino code.
Is there a way to tell Arduino IDE that "hey this function is part of this C library" or, should I re-write my functionality into c++ classes? Its not my favorite solution because the same c-Module is being used in other projects. (I know I probably can use preprocessor directives to have the code in the same place but it is not a pretty solution!)
You have to tell Arduino that your library uses C naming. You can use extern "C"
directly in the Arduino code.
The next code compiles in Arduino IDE 1.05.
extern "C"{
#include <mycLib.h>
}
void setup()
{
mycLibInit(0);
}
void loop()
{
}
mycLib.h
#ifndef _MY_C_LIB_h
#define _MY_C_LIB_h
typedef struct {char data1;
int data2;
} sampleStruct;
void mycLibInit(int importantParam);
void mycLibDoStuff(char anotherParam);
sampleStruct mycLibGetStuff();
#endif
mycLib.c:
#include "mycLib.h"
sampleStruct _sample;
void mycLibInit(int importantParam)
{
//init stuff!
//lets say _sample.data2 = importantParam
}
void mycLibDoStuff(char anotherParam)
{
//do stuff!
//lets say _sample.data1 = anotherParam
}
sampleStruct mycLibGetStuff()
{
//return stuff,
// lets say return _sample;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With