即使-lm是编译标志,仍然出现对'pow'的未定义引用[C]。

8
任何原因
cc -g -lm -DBLITZ_HOST_IS_LITTLE_ENDIAN

使用math.h的代码会产生错误吗?可能GCC版本4.0.3(已记录的工作版本)和版本4.6.3(我的当前版本)之间有区别吗?

makefileasm.c @ https://gist.github.com/3801291

这是在ubuntu 12.04上进行的。

我的终端输出是在gist中的评论。

2个回答

12

不要使用

cc -g -lm -DBLITZ_HOST_IS_LITTLE_ENDIAN foo.c

尝试:

cc -g -DBLITZ_HOST_IS_LITTLE_ENDIAN foo.c -lm
当链接器搜索库文件时,它会链接包含先前未定义符号定义的模块。如果链接器先搜索 -lm 再搜索 foo.o,那么 pow() 函数就不是未定义的。相反,如果先搜索 foo.o,它将取消对 pow() 的定义,然后 -lm 可以解决这个问题。
编辑: 要在您的 makefile 中执行此建议,请进行以下更改:
CFLAGS=-g -DBLITZ_HOST_IS_LITTLE_ENDIAN
LDLIBS=-lm

...

asm: asm.c
        $(CC) $(CFLAGS) asm.c $(LDLIBS) -o asm

请告诉我们更多关于您的编译环境,精确的完整命令行以及一个示例程序。 - Robᵩ
我刚刚注意到makefile仍然将-lm放在asm.c之前,所以现在我要尝试绕过它,看看是否有效。 - BSull
非常感谢。谢谢。不过我遇到了另一个错误。-m32 应该在代码文件之前还是之后添加? - BSull
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/17308/discussion-between-bsull-and-rob - BSull

0

我最近在使用自动构建工具drone.io时遇到了这个问题。

问题是Ubuntu 12.04中的gcc默认链接选项为-Wl,--as-needed。 在我的情况下,该项目正在使用autotools,这意味着我太懒了,不想编写任何内容来修改编译顺序。相反,修改as-needed标志解决了问题。

-gabriel_LDFLAGS = $(GLIB2_LIBS) $(DBUS_LIBS) -lssh
+gabriel_LDFLAGS = -Wl,--no-as-needed $(GLIB2_LIBS) $(DBUS_LIBS) -lssh

如需完整信息,请查看https://bitbucket.org/kikeenrique/gabriel/commits/f08eefdca3f7bb90f48f5a6fbfc8839422572508中的修复提交。

您可以查看应用修复之前的错误日志,也可以查看应用修复之后的无错误日志


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