我在申请的链接过程中发现了一个问题。我对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'
有什么想法吗?
答案 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。