首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >链接数学库在GCC 4.6.1 (Ubuntu 11.10)

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

Stack Overflow用户
提问于 2011-11-21 12:58:11
回答 4查看 3K关注 0票数 2

我在我的应用程序的链接过程中发现了一个问题。我在gcc 4.5版本中没有这样的体验。它尝试使用以下命令链接数学库。

代码语言:javascript
运行
复制
gcc -Wall -Wno-unused -MD -o mems_seektest mems_seektest.o -lm -L. -g -DASSERTS  -I../src// -I../ -I../src//src -DDEBUG -lmems_internals

并报告以下错误消息:

代码语言:javascript
运行
复制
undefined reference to `sqrt'

有什么想法吗?

EN

回答 4

Stack Overflow用户

发布于 2011-11-21 16:26:01

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

代码语言:javascript
运行
复制
gcc -Wall -Wno-unused -MD -o mems_seektest mems_seektest.o  -L. -g -DASSERTS  -I../src// -I../ -I../src//src -DDEBUG -lmems_internals -lm
票数 7
EN

Stack Overflow用户

发布于 2012-02-13 11:32:03

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

代码语言:javascript
运行
复制
$ 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

但这确实是:

代码语言:javascript
运行
复制
$ gcc eg.o -o eg -lm

我遇到这个问题是因为我在Makefile中使用了"LDFLAGS=-lm“。如果改为使用"LDLIBS=-lm“,则可以正常工作。

票数 4
EN

Stack Overflow用户

发布于 2011-11-21 15:44:13

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

您可以使用以下内容来检查未解析符号的来源

代码语言:javascript
运行
复制
nm yourLibrary | grep sqrt

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8207464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档