如何找出哪个库是给定对象的主页?

时间:2008-11-14 17:33:59

标签: c unix linker fortran sgi

我在运行Irix 6.5的SGI上使用FORTRAN和C进行编程,但这应该适用于所有类Unix系统。当我收到“未解决的文本符号”链接错误时,如何找到需要链接到我的程序的库?这是我从链接器中看到的一个例子:

ld32: ERROR  33 Unresolved text symbol "ortho2_" -- first referenced by ./libfoo.a

我是否只需知道需要哪些库,或者是否有某些工具或命令可以帮助我解决这个问题?

5 个答案:

答案 0 :(得分:9)

您可以使用nm命令列出共享库中的动态符号:

nm -D /lib/libc.so.6

然后grep找到您要查找的符号。省略-D用于静态库。您可以在循环中使用它或使用xargs扫描多个库。

我通常只使用谷歌(假设该符号来自公开的库)。

答案 1 :(得分:3)

使用nm(如Robert Gamble's answer中所述)是您问题的正确答案。诀窍是知道在哪里寻找库。你的课程做什么?如果有大量的数字存在,你可能应该链接数学库(如LAPACK或BLAS),并可能想开始寻找那里。网页搜索也很有帮助 - 我在我最喜欢的搜索引擎中键入了“ortho2”并得到了this documentation,表明它在libfgl.a

请注意,在搜索时,您应该省略尾随下划线 - 它通常由编译器添加到例程名称中。

答案 2 :(得分:3)

我拒绝将此添加到Robert Gamble的答案中的诱惑 - 认为这是对它的补充。

要小心,假设“任何匹配”都可以使用。在另一个SO问题中有一个案例,其中一段代码从Windows移动到Unix,Windows代码使用getch()从输入中读取单个字符。用户经历了类似于此的过程,并在getch()库中的Unix上找到了curses。因此,用户与curses库链接,并想知道为什么代码核心被转储。麻烦的是,实际使用的getch()假定已经完成了正确的初始化,并且没有进行正确的初始化。事实上,它可能不是常规所必需的。

在Solaris上,nm有一些选项可以告诉您库中的库名称甚至是包含符号的目标文件(库名为-r-R对于库内的对象。)

当心C ++受损的名字。 ortho2示例显然不是C ++损坏。

答案 3 :(得分:2)

如果它是标准函数,也可以是ortho2,手册页将告诉您它所在的库。

答案 4 :(得分:2)

我有一点寻找脚本。输入lookfor func_name

#!/bin/csh
foreach i (*.o *.a *.so)
 echo $i
 nm $i | grep -i $1
end