未定义的'pow'引用,即使-lm是一个编译标志。 [C]

时间:2012-09-28 17:49:18

标签: c gcc compiler-errors cc

任何原因

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上

我的终端输出是要点中的注释。

2 个答案:

答案 0 :(得分:8)

而不是

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

答案 1 :(得分: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

中查看修正提交

您可以查看to the log with errors BEFORE applying the fix,也可以查看to the log without errors AFTER applying the fix