7

任何原因

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 上

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

4

2 回答 2

11

代替

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
于 2012-09-28T17:51:29.220 回答
0

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

问题是 Ubuntu 12.04 中的 gcc 默认与-Wl,--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中的修复提交

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

于 2016-03-08T16:02:11.837 回答