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

任何原因cc -g -lm -DBLITZ_HOST_IS_LITTLE_ENDIAN都会在使用math.h的代码中产生错误? cc 4.0.3(记录的工作版本)和4.6.3(我当前版本)之间是否存在差异?

makefile和asm.c https://gist.github.com/3801291

这是在ubuntu 12.04上

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

代替

cc -g -lm -DBLITZ_HOST_IS_LITTLE_ENDIAN foo.c 

尝试:

 cc -g -DBLITZ_HOST_IS_LITTLE_ENDIAN foo.c -lm 

当链接器搜索库时,它链接在包含先前未定义符号的定义的模块中。

如果链接器在foo.o之前搜索-lm ,则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 

我最近使用自动构建器(即drone.io)遇到了这个问题。

问题是Ubuntu 12.04中的gcc默认链接为-Wl, – 根据需要 。 在我的情况下,该项目使用autotools,这意味着我懒得写任何东西来修改编译顺序。 相反,修改按需标志可以解决问题。

 -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查看修正提交

应用修复程序之前,您可以查看包含错误的日志,还可以应用修复程序后查看日志而不会出现错误 。