我有一个小问题,我已经尝试过测试这个功能的所有内容,请你帮忙吗?我需要编写一个名为“mutual_info.c”的C文件,它需要一个数学函数。我已经包含了库并将它链接到makefile中,但它仍然给我“未定义的日志引用”...我的包含如下所示:(我在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
但它仍然无法正常工作!!请任何人,我需要帮助!谢谢!
答案 0 :(得分: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
。)
这应该有效,但我们可以使它更整洁。首先我们介绍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 $@
然后我们看到这些配方使用相同的命令,因此我们创建了一个模式规则:
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 $@
尝试一下,告诉我们它是否有效。
答案 1 :(得分:0)
这是Makefile中的片段吗?你试过导出LDFLAG吗?我之前看到过这个错误,但它总是用-lm标志修复。
gcc -lm -o blah blah.c
答案 2 :(得分: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 -o mutual_info.o mutual_info.c
gcc -o YourExecutableName amostra.o graph_or.o graph_w.o mutual_info.o -lm
答案 3 :(得分: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)
请澄清这是不是你想要的。