Question

I have a small problem, and I have tried everything to test this function, could you please help me? I need to write a C file that is called "mutual_info.c", and it needs a mathematical function. I have included the library and linked it in the makefile, but it still gives me "undefined reference to log"... my includes look like this: (I'm using Eclipse on Ubuntu)

#include <stdio.h>
#include <stdlib.h>
#include "sample.h"
#include "graph_or.h"
#include <math.h>

and my makefile looks like this:

all:

    gcc -g amostra.c sample.h -o amostra.o

    gcc -g graph_or.c graph_or.h -o graph_or.o

    gcc -g graph_w.c graph_W.h -o graph_W.o

    gcc -g mutual_info.c -o mutual_info.o -lm

clean:
    rm *.o

I have absolutely no idea what is going on, I have even tried to define the LDFLAGS before the command "all" and putting it like this:

LDFLAGS= -lm
all:

    gcc -g amostra.c sample.h -o amostra.o

    gcc -g graph_or.c graph_or.h -o graph_or.o

    gcc -g graph_w.c graph_W.h -o graph_W.o

    gcc -g mutual_info.c -o mutual_info.o -lm

clean:
    rm *.o

But it still won't work!! Please anyone, I need help with this! Thanks!

Was it helpful?

Solution

Let's take this in steps.

The usual way to write a makefile is to have a rule for each target, and to use prerequisites:

thing: amostra.o graph_or.o graph_w.o mutual_info.o
    gcc -g amostra.o graph_or.o graph_w.o mutual_info.o -o thing -lm

mutual_info.o: mutual_info.c
    gcc -g -c mutual_info.c -o mutual_info.o -lm

amostra.o: amostra.c sample.h
    gcc -g -c amostra.c -o amostra.o

graph_or.o: graph_or.c graph_or.h 
    gcc -g -c graph_or.c -o graph_or.o

graph_w.o: graph_w.c graph_w.h
    gcc -g -c graph_w.c -o graph_w.o

mutual_info.o: mutual_info.c
    gcc -g -c mutual_info.c -o mutual_info.o -lm

(I have guessed that you want the executable to be called thing, and that you meant graph_w, not graph_W.)

That should work, but we can make it tidier. First we introduce automatic variables:

thing: amostra.o graph_or.o graph_w.o mutual_info.o
    gcc -g $^ -o $@ -lm

mutual_info.o: mutual_info.c
    gcc -g -c $< -o $@

amostra.o: amostra.c sample.h
    gcc -g -c $< -o $@

graph_or.o: graph_or.c graph_or.h 
    gcc -g -c $< -o $@

graph_w.o: graph_w.c graph_w.h
    gcc -g -c $< -o $@

mutual_info.o: mutual_info.c
    gcc -g -c $< -o $@

Then we see that these recipes use the same command, so we create a pattern rule:

thing: amostra.o graph_or.o graph_w.o mutual_info.o
    gcc -g $^ -o $@ -lm

amostra.o: sample.h

graph_or.o: graph_or.h 

graph_w.o: graph_w.h

%.o: %.c
    gcc -g -c $< -o $@

Give this a try and tell us if it works.

OTHER TIPS

Is that a snippet from your Makefile? Hav you tried exporting LDFLAGs? I have seen this error before, but it was always fixed with the -lm flag.

gcc -lm -o blah blah.c

you need to:
gcc -c -o amostra.o amostra.c
gcc -c -o graph_or.o graph_or.c
gcc -c -o graph_w.o graph_w.c
gcc -c -o mutual_info.o mutual_info.c
gcc -o YourExecutableName amostra.o graph_or.o graph_w.o mutual_info.o -lm

Here's a generic makefile using my best guess of what you want to achieve: It compiles all *.c files in the current directory and creates a binary mutual_info.

RM := rm -f
CC := gcc
CFLAGS := -g
LDLIBS := -lm

SOURCES := $(wildcard *.c)
OBJECTS := $(SOURCES:%.c=%.o)
DEPS := $(SOURCES:%.c=%.d)
BINARY := mutual_info
FILES_TO_CLEAN := $(OBJECTS) $(DEPS)

.PHONY : all clean realclean

all : $(BINARY)

clean :
    $(RM) $(FILES_TO_CLEAN)

realclean : FILES_TO_CLEAN += $(BINARY)
realclean : clean

-include $(DEPS)

$(OBJECTS) : %.o : %.c
    $(CC) $(CFLAGS) -c -MMD -o $@ $<

$(BINARY) : $(OBJECTS)
    $(CC) -o $@ $^ $(LDLIBS)

Please clarify if that's not what you want.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top