Ubuntu 11.10 上的C数学链接问题

21

我在将Ubuntu从(10.11, 11.04我不确定)升级到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中也遇到了同样的问题。在升级之前我没有任何问题。在我的情况下,问题来自于以下命令,请问您有什么建议吗?gcc -Wall -Wno-unused -MD -o mems_seektest mems_seektest.o -lm -L. -g -DASSERTS -I../src// -I../ -I../src//src -DDEBUG -lmems_internals - ARH
5个回答

27

1
这不是准确的。通常,在库共享时,顺序并不重要。问题只在指定了 --as-needed 或将其设置为默认值时才会出现。 - Vladimir Prus
3
@VladimirPrus:你们两个都是对的 :-). 最近的Ubuntu版本(自11.04/Natty Narwhal以来)将--as-needed设为默认选项。参见https://wiki.ubuntu.com/NattyNarwhal/ToolchainTransition。 - sleske
@sleske 嗯...这是一个错误吗?相当多的工具链总是按照设计将文件列表放在命令的末尾(例如Qt)。这也会在automake\cmake中创建更多的问题。 - Swift - Friday Pie

17

已解决,这不是常见的缺少-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!


10

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

更多信息请参见:http://www.gentoo.org/proj/en/qa/asneeded.xml

简单解决方法(至少对我有效):

在链接器中添加-Wl,--no-as-needed


这种方法的轻微缺点是Math库总是被包含进来,即使没有使用Math库。因此,如果您总是包含大量不管是否使用的库,请不要使用该方法。 - Roalt
然而,当文件以错误的顺序给出时,链接器无法找到引用,同时在链接静态库时也是如此。据推测,ld --no-as-needed 标记所有共享库,让 ld.so 解决引用问题。 - Ale

4
我在将Ubuntu升级到11.10版本后遇到了同样的问题。我使用Netbeans进行开发,并通过以下方式指定“Mathematics”标准库来解决问题:
右键单击项目,点击属性,在菜单中选择“链接器”,点击“库”,然后选择“添加标准库”并选择“数学库”。
编译时,“-lm”选项位于所有其他选项之后,它可以正常工作。可能这个gcc版本遵循特定的架构,期望在编译命令行的末尾放置库。
干杯!
D.

2
cc filename.c -lm

just try..........☻


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接