在Ubuntu上出现"Undefined reference to exp"的错误(包括math.h和链接-lm)

5

我正在尝试在Ubuntu上编译一个使用exp函数的程序,但遇到了一些问题。gcc报错如下:

selied@Apolo:~/Dropbox/practicas UAM/Neuro/practica3$ make
gcc -lm -o retropropagacion retropropagacion.o 
retropropagacion.o: In function `main':
/home/selied/Dropbox/practicas UAM/Neuro/practica3/retropropagacion.c:177: undefined     reference to `exp'
/home/selied/Dropbox/practicas UAM/Neuro/practica3/retropropagacion.c:186: undefined reference to `exp'
/home/selied/Dropbox/practicas UAM/Neuro/practica3/retropropagacion.c:297: undefined reference to `exp'
/home/selied/Dropbox/practicas UAM/Neuro/practica3/retropropagacion.c:306: undefined reference to `exp'
collect2: ld devolvió el estado de salida 1
make: *** [retropropagacion] Error 1

这里我给你展示我的makefile文件。

CC      = gcc
LDLAGS  = -lm
CFLAGS  = -Wall -g
EXE     = retropropagacion normalizar
OBJ     = 
INC     = 

compile    : $(EXE)

clean  :
    @echo Borrando archivos temporales...
    rm -f *~ *.o core $(EXE)

help    :
    @echo   

backpropagation : 
    ./retropropagacion entrada.txt 0 0 salida.txt

and : 
    ./retropropagacion and.dat 0 0 salida_and.txt

$(EXE) : % : %.o $(OBJ)
    $(CC) $(LDLAGS) -o $@ $@.o $(OBJ)

%.o : %.c $(INC)
    $(CC) $(CFLAGS) -c $<

另外,我已经在头文件的顶部包含了 #include,并且它在另一台计算机上运行正常。

您知道发生了什么吗?

2个回答

11
$(CC) $(LDLAGS) -o $@ $@.o $(OBJ)

应该是这样的

$(CC) -o $@ $@.o $(OBJ) $(LDLAGS)

在GCC的不同版本中,是否可以在目标文件之前使用-l标志是不确定的。


谁给那个答案点了踩,他们自己也应该被踩!如果真的有一个允许这样做的GCC版本,那就是一个bug。 - ams
这解决了我的问题,因为一个无关的程序只使用了makefile而没有configure脚本。 - Nick
我已经尝试解决这个问题有一段时间了。如果我完全省略讨论中的那行代码,为什么make会默认将LDFLAGS放在目标文件前面?相同的代码在Fedora上可以正常工作,但在Ubuntu上无法编译。除了在每个Makefile中覆盖它之外,是否有任何控制此行为的方法? - Jakuje

2
没关系。如果您对这个问题进一步感兴趣或者苦苦挣扎已久,也可以联系我们。
LDLAGS  = -lm

应该写成

LDLIBS = -lm

因为LDLIBS放在目标文件之后,而不像LDFLAGS那样默认模板中放在它们之前,详见文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接