在 GCC 4.6.1 (Ubuntu 11.10) 中链接数学库
我发现我的应用程序的链接过程存在问题。我的 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'
有什么想法吗?
I find a problem in the linking process of my application. I did not have the same with gcc 4.5. It tries to link math library with the following command.
gcc -Wall -Wno-unused -MD -o mems_seektest mems_seektest.o -lm -L. -g -DASSERTS -I../src// -I../ -I../src//src -DDEBUG -lmems_internals
and report following error massages:
undefined reference to `sqrt'
Any idea ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
最近的 gcc/ld 默认使用 --as-needed 链接器标志。实际上,这意味着必须在命令行上以依赖关系的相反顺序指定库。如果 mems_internals 库需要 sqrt 函数,则在 -lmems_internals 之后添加 -lm。
recent gcc/ld uses the --as-needed linker flag as default. Practically, that means libraries have to be specified in the reverse order of dependencies on the command line. If the mems_internals library needs the sqrt function your -lm after -lmems_internals.
我在 gcc 4.6.1 上也遇到了同样的问题,即使只有一个库。这不起作用:
但这确实有效:
我之所以这么做是因为我在 Makefile 中使用了“LDFLAGS=-lm”。如果您使用“LDLIBS=-lm”代替,则工作正常。
I've had the same problem with gcc 4.6.1, even with only one library. This doesn't work:
But this does:
I hit this because I was using "LDFLAGS=-lm" in my Makefile. Works fine if you use "LDLIBS=-lm" instead.
您没有告诉我们
-lmems_internals
是什么,但也许未解析的符号来自那里。-l
选项的顺序通常对链接器很重要,您应该始终将系统库放在最后。您可以使用类似的方法来检查未解析的符号来自何处,
如果
sqrt
前面有一个U
则表示该符号未定义。You didn't tell us what
-lmems_internals
is, but maybe the unresolved symbol comes from there. The order of the-l
options is generally important to the linker, you should always put system libraries last.You can check where the unresolved symbol comes from by using something like
if there is a
U
in front ofsqrt
the symbol is undefined.我想说链接器使用了错误的 libm。
I'd say the linker is using the wrong libm.