abg3342
abg3342

Reputation: 23

Getting a C error that I have an undefined reference to function, but the function is defined

I am trying to take a binary to decimal function out of my main.c file and into its own file, but when I compile the files with my makefile I get the error:

undefined reference to `btod'

Here is my main.c file:

#include "btod.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int n;
    printf("\nEnter a binary number: ");
    char c[100];
    scanf("%s",c);
    printf("Number converted to decimal: %d\n\n\n",btod(strlen(c),c));
    return 0;
}

Here is my btod.c file:

#include <stdlib.h>
#include <string.h>

int btod(int size,char inputBin[size])
{
    int i,num=0;
    for(i=0;i<size;i++)
    {
        num=num*2+(inputBin[i]-48);
    }
    return num;
}

Here is my btod.h file:

int btod(int size,char inputBin[size]);

And lastly, here is my makefile:

CC = gcc
INCLUDE = -I.
CFLAGS = -g -Wall
LDFLAGS = -L. \
    -L/usr/lib
LDLIBS = \
    -lc -lm
.c.o:
    $(CC) $(INCLUDE) $(CFLAGS) -c $<
all: main
main: main.o
    $(CC) -o $@ $^ $(LDFLAGS) $(LDLIBS)
btod: btod.o
    $(CC) -o $@ $^ $(LDFLAGS) $(LDLIBS)

clean:
    rm -f *.o
    rm -f main

I am thinking it might have to do with the btod.c file not being compiled properly within the makefile but I cannot figure out what is incorrect about it.

Upvotes: 2

Views: 74

Answers (1)

user9706
user9706

Reputation:

The error is because you don't link in btod.o when building main. If you use GNU Make, you can simplify your Makefile to just a few lines:

.PHONY: all clean
CFLAGS = -g -Wall

all: main

clean:
    rm -f *.o main

main: btod.o main.o

In btod.c use '0' instead of 48. In main.c remove the line int n.

Upvotes: 3

Related Questions