Go Down

Topic: Header file wquestion (Read 817 times) previous topic - next topic

MacFlecknoe

Dec 08, 2008, 01:26 am Last Edit: Dec 08, 2008, 01:27 am by MacFlecknoe Reason: 1
I am getting the following error after I attempt to break out a function definition from a header file I wrote:

Code: [Select]

o: In function `readBytes()':
undefined reference to `add_byte(byte_array*, unsigned char)'


The header file (byte_array_s.h) looks like this:

Code: [Select]


#ifndef _byte_array_h
#define _byte_array_h

#include <WProgram.h>

typedef struct byte_array {
 byte *data;    // array of bytes this struct is meant to represent
 int size;      // number of bytes the structure possesses
 int bitsRead;  // number of bits contained in the structure (this is different than 8 * size)
} byte_array_s;

void add_byte(byte_array_s *byteArray, const byte _byte);

#endif



And this is the code that is throwing the error (currentByte is of type 'byte' and byteArray is a pointer to a byte_array_s BTW):

Code: [Select]

#include "byte_array_s.h"
...
byte_array_s * readBytes() {
 ...
 if(bitCounter != 0) add_byte(byteArray, currentByte);
 ...
}


Can anyone tell me what I am doing wrong? Is the definition not defined properly?

westfw

this is a "link" error; your definition is fine, but there doesn't appear to actually be an "add_byte" function created anywhere in your sketch.
(the "void add_byte(byte_array_s *byteArray, const byte _byte);" statement you have is a "prototype" that describes what the function looks like without actually creating any code.  The code is what is missing.)

Tim Stamp

try replacing this
Code: [Select]
void add_byte(byte_array_s *byteArray, const byte _byte);

with this
Code: [Select]
void add_byte(byte_array_s *byteArray, const byte _byte)
{
   //do something;
}

- Tim

MacFlecknoe

#3
Dec 08, 2008, 02:26 pm Last Edit: Dec 08, 2008, 02:29 pm by MacFlecknoe Reason: 1
I should have been more clear. I DO have the code defined in a separate file (byte_array_s.c). This file is saved in the same directory as the others. I presumed that the IDE would link them all together?

Am  I mistaken about that?

Code: [Select]


mlambert@gnuget:~/arduino/arduino-0012/sketchbook/HID$ ls
applet  byte_array_s.c byte_array_s.h  HID.pde


westfw

You have to either re-open the sketch or explicitly add the file in order for it to be "noticed" as part of the sketch.  If it dosn't show up on a tab in your sketch, it won't get compiled...

MacFlecknoe

The ".c" files do show up as sperate tabs in the IDE but the only way I can get them to compile is to include them in the original sketch. :-/ Is this a known issue or is anyone else experiencing these problems?

Building the modules on the command line works but the Make file I downloaded seems to have trouble compiling the sketch itself (it is looking for a file that doesnt exist: 'WRandom.cpp') so that was a dead-end. Is there an updating Makefile (the md5sum for the file I have is cf4933cf13ee4d194060c76c69fa9471)?

beginner

I had a similar problem so I posted a question yesterday and I got the answer: http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1228866246

As indicated, I renamed the .c files to .cpp and everything works now. I hope this helps.

MacFlecknoe

#7
Dec 10, 2008, 04:44 pm Last Edit: Dec 10, 2008, 05:24 pm by MacFlecknoe Reason: 1
Thank you so much I think this is the answer I was looking for! :-)


Update: added "extern C" to the header files as described in the linked thread and also here http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html and it now compiles

Thanks all!

Go Up