1

I have the following code:

main.c

#include "checksum.h"

void main()
{
    char *Buf ="GPGGA204502.005106.9813N11402.2921W1090.91065.02M-16.27M";
    checksum(Buf);
}

checksum.c

#include <stdio.h>
#include <string.h>

checksum(char *Buff)
{
    int i;
    unsigned char XOR;
    unsigned long iLen = strlen(Buff);
    printf("Calculating checksum...\n");
    for (XOR = 0, i = 0; i < iLen; i++)
        XOR ^= (unsigned char)Buff[i];
    printf("%X \n",XOR);
}

checksum.h

#ifndef CHECKSUM_H_INCLUDED
#define CHECKSUM_H_INCLUDED

void checksum(char *Buff);

#endif

When compiling I get the following error:

/tmp/ccFQS7Ih.o: In function `main':
main.c:(.text+0x18): undefined reference to `checksum'
collect2: ld returned 1 exit status

I can't figure out what the problem is?

2
  • 2
    Can you post the compiler command? You need to link the checksum.o when building main. Commented Mar 20, 2012 at 10:34
  • You have gotten a warning also when compiling (and if not, your compiler settings are bad). Your function declaration (that's what in the .h file) and its defintion (that what is in the .c) do not match. By not writing the void before checksum, the function is re-declared as a function returning an int. Commented Mar 20, 2012 at 12:09

3 Answers 3

3

You are compiling only one file not both. More precisely, you are not linking the files together.

I don't know your compiler, but with gcc, it would be something like this:

gcc -c main.c          <-- compile only
gcc -c checksum.c      <-- compile only
gcc main.o checksum.o  <-- link the two

Edit: To automate this process, take a look at the make program which reads Makefiles.

Sign up to request clarification or add additional context in comments.

3 Comments

Hmm, that did the trick! Is there a way to automate this when using gcc? I't is for AVR, but I'm testing some code in linux terminal...
You can also do gcc main.c checksum.c
@StianL, I tried explaining makes and Makefiles twice now, but my computer kept crashing for no apparent reason and I lost all I had written. Your bad luck. Anyway, follow the links I wrote in my edit and you should be able to conjure up a simple Makefile quite quickly.
2

You could also try gcc -o program.out main.c checksum.c which will compile and link both files together

Comments

1

I think: in checksum.c, you should include checksum.h.

1 Comment

-1. That's a linker error, it doesn't occur during the compile stage, but during linkage.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.