【问题标题】:c math linker problems on Ubuntu 11.10 [duplicate]Ubuntu 11.10上的c数学链接器问题[重复]
【发布时间】:2011-12-11 02:04:07
【问题描述】:

我将 Ubuntu 从 (10.11, 11.04 i dont know) 升级到 11.10 后出现了一些奇怪的错误。

我在使用 math.h 并与 -lm 链接时收到undefined reference to 'sqrt'

我正在使用 gcc -Wall -Werror -g -Iinclude/ -lm lib/matrix.c src/analyse.c -o bin/analyse.o 进行编译,源文件都使用并包含 math.h。

这段代码编译后没有问题,升级后我没有做太多改动,但现在它不起作用了。

你有什么建议我可以做些什么来找出错误?

对不起,如果之前有人问过这个问题;有很多关于数学链接器错误的帖子,我没有找到一个匹配的

【问题讨论】:

  • 我在 Ubuntu 11.10 中确实有同样的问题。在升级之前我没有任何问题。在我的情况下,问题来自以下命令,你有什么 cmets 给我吗? gcc -Wall -Wno-unused -MD -o mems_seektest mems_seektest.o -lm -L。 -g -DASSERTS -I../src// -I../ -I../src//src -DDEBUG -lmems_internals

标签: c gcc ubuntu linker math.h


【解决方案1】:

当您从命令行使用它时,您正在使用的库需要放在使用它的文件之后。所以将-lm放在命令行上你的C文件之后。

Reference

【讨论】:

  • 这不准确。通常,共享库时的顺序无关紧要。该问题仅在指定 --as-needed 或设置为默认值时出现。
  • @VladimirPrus:你们都是对的 :-)。最近的 Ubuntu 版本(从 11.04/Natty Narwhal 开始)将 --as-needed 设置为默认值。见wiki.ubuntu.com/NattyNarwhal/ToolchainTransition
  • @sleske erg.. 这是个错误吗?相当多的 toolchans 总是按照设计将文件列表放在命令的末尾(例如 Qt)。这也会给 automake\cmake 带来更多问题
【解决方案2】:

已解决,这不是常见的缺少 -lm 问题!升级到 (k)ubuntu 11.10 后我处于同样的情况!

$ whereis math.h
math: /usr/include/math.h

Makefile:
CC=gcc
CFLAGS=--std=c99 -g -pedantic -Wall -lm

uname:
Linux idefix 3.0.0-12-generic #20-Ubuntu SMP Fri Oct 7 14:56:25 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux

你真的必须把 -lm 开关放在 -o foo foo.c 参数之后

Output:
pidi@idefix:~/projekt1$ make
gcc -o b1 b1.c --std=c99 -g -pedantic -Wall -lm
pidi@idefix:~/projekt1$

所以在 Makefile 中交换你的标志!伙计们。这是相当新的(和严重的)BUG!

【讨论】:

    【解决方案3】:

    这是由于链接器中默认激活 gcc 标志--as-needed 导致的问题

    更多信息在这里:http://www.gentoo.org/proj/en/qa/asneeded.xml

    简单的修复(至少对我有用):

    -Wl,--no-as-needed添加到链接器

    【讨论】:

    • 这种方法的小缺点是始终包含数学库,即使不使用数学库也是如此。因此,如果您总是包含许多独立的库(无论是否使用),请不要使用它们。
    • 但是,当文件以错误的顺序给出时,链接器也无法找到引用,并且与静态库链接时也是如此。据推测,ld --no-as-needed,无论如何都标记所有共享库,让ld.so 计算出引用。
    【解决方案4】:

    在将我的 Ubuntu 升级到 11.10 版本后,我发现了同样的问题。 我使用 Netbeans 通过指定“数学”标准库来开发和解决问题,如下所示:

    右键单击项目,单击属性,在菜单上选择“链接器”,单击“库”,然后单击“添加标准库”,选择“数学”。

    编译时,'-lm' 选项被放置在所有其他选项之后并且它可以工作。可能这个 gcc 版本遵循特定的体系结构,并且它期望库位于命令编译行的末尾。

    干杯!

    D.

    【讨论】:

      【解决方案5】:
      cc filename.c -lm
      

      试试........☻

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-23
        • 1970-01-01
        • 1970-01-01
        • 2010-10-02
        • 1970-01-01
        • 2012-01-19
        相关资源
        最近更新 更多