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

发布于 2024-12-17 07:24:44 字数 314 浏览 0 评论 0原文

我发现我的应用程序的链接过程存在问题。我的 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

长伴 2024-12-24 07:24:44

最近的 gcc/ld 默认使用 --as-needed 链接器标志。实际上,这意味着必须在命令行上以依赖关系的相反顺序指定库。如果 mems_internals 库需要 sqrt 函数,则在 -lmems_internals 之后添加 -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

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 -Wall -Wno-unused -MD -o mems_seektest mems_seektest.o  -L. -g -DASSERTS  -I../src// -I../ -I../src//src -DDEBUG -lmems_internals -lm
梦冥 2024-12-24 07:24:44

我在 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”代替,则工作正常。

I've had the same problem with gcc 4.6.1, even with only one library. This doesn't work:

$ 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

But this does:

$ gcc eg.o -o eg -lm

I hit this because I was using "LDFLAGS=-lm" in my Makefile. Works fine if you use "LDLIBS=-lm" instead.

不奢求什么 2024-12-24 07:24:44

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

您可以使用类似的方法来检查未解析的符号来自何处,

nm yourLibrary | grep sqrt

如果 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

nm yourLibrary | grep sqrt

if there is a U in front of sqrt the symbol is undefined.

骄傲 2024-12-24 07:24:44

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

I'd say the linker is using the wrong libm.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文