在GCC 4.6.1中链接数学库(Ubuntu 11.10)

时间:2011-11-21 04:58:11

标签: c gcc linker

我在申请的链接过程中发现了一个问题。我对gcc 4.5没有相同的看法。它尝试将数学库与以下命令链接。

gcc -Wall -Wno-unused -MD -o mems_seektest mems_seektest.o -lm -L. -g -DASSERTS  -I../src// -I../ -I../src//src -DDEBUG -lmems_internals

并报告以下错误按摩:

undefined reference to `sqrt'

有什么想法吗?

4 个答案:

答案 0 :(得分:5)

最近gcc / ld使用--as-needed链接器标志作为默认值。实际上,这意味着必须以与命令行相关的相反顺序指定库。如果mems_internals库在-lmems_internals之后需要sqrt函数你的-lm。

gcc -Wall -Wno-unused -MD -o mems_seektest mems_seektest.o  -L. -g -DASSERTS  -I../src// -I../ -I../src//src -DDEBUG -lmems_internals -lm

答案 1 :(得分:3)

您没有告诉我们-lmems_internals是什么,但也许未解决的符号来自那里。 -l选项的顺序通常对链接器很重要,您应该始终将系统库放在最后。

您可以使用

之类的内容检查未解析符号的来源
nm yourLibrary | grep sqrt

如果U前面有sqrt,则该符号未定义。

答案 2 :(得分:3)

即使只有一个库,我也遇到了与gcc 4.6.1相同的问题。这不起作用:

$ gcc -lm eg.o -o eg
eg.o: In function `foo':
/home/nick/tmp/eg.c:5: undefined reference to `sqrt'
collect2: ld returned 1 exit status

但这样做:

$ gcc eg.o -o eg -lm

我点击这个是因为我在Makefile中使用了“LDFLAGS = -lm”。如果您使用“LDLIBS = -lm”,则可以正常工作。

答案 3 :(得分:0)

我说链接器使用了错误的libm。