【问题标题】:Undefined reference to 'pow' even though -lm is a compile flag. [C]即使 -lm 是编译标志,对“pow”的未定义引用也是如此。 [C]
【发布时间】:2012-09-20 15:05:10
【问题描述】:

任何原因

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 上

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

【问题讨论】:

    标签: c gcc compiler-errors cc


    【解决方案1】:

    代替

    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
    

    【讨论】:

    • 然后告诉我们更多关于你的编译环境、精确的整个命令行和一个示例程序。
    • 我刚刚注意到 makefile 仍然将 -lm 放在 asm.c 之前,所以我现在将尝试绕过它,看看它是否有效。
    • 非常感谢。谢谢。我确实遇到了另一个错误。 -m32 应该加在代码文件之前还是之后?
    【解决方案2】:

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

    问题是 Ubuntu 12.04 中的 gcc 默认使用 -Wl,--as-needed 链接。 就我而言,该项目使用的是自动工具,这意味着我懒得写任何东西来修改编译顺序。相反,修改 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

    【讨论】:

      猜你喜欢
      • 2015-02-13
      • 2013-04-27
      • 1970-01-01
      • 2021-09-22
      • 2022-11-02
      • 1970-01-01
      • 2020-07-21
      • 2020-04-17
      相关资源
      最近更新 更多