0

我有一个小问题,我已经尝试了一切来测试这个功能,你能帮我吗?我需要编写一个名为“mutual_info.c”的 C 文件,它需要一个数学函数。我已包含该库并将其链接到生成文件中,但它仍然给了我“未定义的日志引用”......我的包含看起来像这样:(我在 Ubuntu 上使用 Eclipse)

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

我的makefile看起来像这样:

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

我完全不知道发生了什么,我什至尝试在命令“all”之前定义 LDFLAGS 并将其如下所示:

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

但是还是不行!!请任何人,我需要帮助!谢谢!

4

4 回答 4

1

让我们一步一步来。

编写 makefile 的常用方法是为每个目标设置一个规则,并使用先决条件:

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

(我猜你想要调用可执行文件thing,你的意思是graph_w,不是graph_W。)

这应该可以,但我们可以让它更整洁。首先我们引入自动变量

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 $@

然后我们看到这些配方使用相同的命令,所以我们创建了一个模式规则:

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 $@

试一试,告诉我们它是否有效。

于 2012-05-01T13:17:02.017 回答
0

那是您的 Makefile 中的一个片段吗?您是否尝试过导出 LDFLAG?我以前见过这个错误,但它总是用 -lm 标志修复。

gcc -lm -o blah blah.c

于 2012-05-01T10:31:02.917 回答
0

你需要:
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 -omutual_info.omutual_info.c
gcc - o YourExecutableName amostra.o graph_or.o graph_w.omutual_info.o -lm

于 2012-05-01T10:57:51.223 回答
0

这是一个通用的makefile,它使用我对您想要实现的最佳猜测:它编译*.c当前目录中的所有文件并创建一个二进制文件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)

请澄清这是否不是您想要的。

于 2012-05-01T11:09:25.363 回答