4

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

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

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

4

5 回答 5

9

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

nm -D /lib/libc.so.6

然后grep是您正在寻找的符号。省略静态库的 -D。您可以在循环中或与 xargs 一起使用它来扫描多个库。

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

于 2008-11-14T17:40:20.730 回答
3

使用nm(如Robert Gamble 的回答)是您问题的正确答案。诀窍在于知道在哪里寻找图书馆。你的程序是做什么的?如果有大量的数字在进行,很可能您应该链接数学库(如 LAPACK 或 BLAS)并且可能想要开始查找那里。网络搜索也很有帮助——我在我最喜欢的搜索引擎中输入了“ortho2”并得到了表明它在libfgl.a

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

于 2008-11-14T17:55:56.657 回答
3

我抵制了将其添加到 Robert Gamble 的答案的诱惑 - 将其视为对它的补充。

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

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

也要小心 C++ 错误的名称。该ortho2示例显然不是 C++ 损坏的。

于 2008-11-15T16:55:48.853 回答
2

如果它是一个标准函数,可能是 ortho2,手册页会告诉你它在哪个库中。

于 2008-11-15T17:21:27.723 回答
2

我有一个小查找脚本。输入查找 func_name

#!/bin/csh
foreach i (*.o *.a *.so)
 echo $i
 nm $i | grep -i $1
end
于 2008-11-17T15:56:49.390 回答