how to use standard c header files in arduino
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;
}
AleX_
Ex-Engineer, Self taught software developer. I really enjoy coding in C, C++, C#, JavaScript, Love HTML UI design.
Updated on June 12, 2022Comments
-
AleX_ almost 2 years
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:
- http://www.arduino.cc/en/hacking/libraries
- http://playground.arduino.cc/Code/Library
- http://forum.arduino.cc/index.php?topic=37371.0
- http://arduino.cc/en/Hacking/BuildProcess
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!)