我在运行 Irix 6.5 的 SGI 上用 FORTRAN 和 C 编程,但这应该适用于所有类 Unix 系统。当我收到“未解析的文本符号”链接错误时,如何找到需要链接到我的程序的库?这是我从链接器看到的示例:
ld32: ERROR 33 Unresolved text symbol "ortho2_" -- first referenced by ./libfoo.a
我只需要知道需要哪些库,还是有一些工具或命令可以帮助我解决这个问题?
您可以使用该nm
命令列出共享库中的动态符号:
nm -D /lib/libc.so.6
然后grep
是您正在寻找的符号。省略静态库的 -D。您可以在循环中或与 xargs 一起使用它来扫描多个库。
我通常只使用 google(假设该符号来自公开可用的库)。
使用nm
(如Robert Gamble 的回答)是您问题的正确答案。诀窍在于知道在哪里寻找图书馆。你的程序是做什么的?如果有大量的数字在进行,很可能您应该链接数学库(如 LAPACK 或 BLAS)并且可能想要开始查找那里。网络搜索也很有帮助——我在我最喜欢的搜索引擎中输入了“ortho2”并得到了表明它在libfgl.a
请注意,当您搜索时,您可能应该省略结尾的下划线 - 它通常由编译器添加到例程名称中。
我抵制了将其添加到 Robert Gamble 的答案的诱惑 - 将其视为对它的补充。
谨防简单地假设“任何匹配”都可以使用。在另一个 SO question 中有一个案例,其中一段代码从 Windows 移动到 Unix,而 Windows 代码用于getch()
从输入中读取单个字符。用户经历了与此类似的过程,并在库getch()
中的 Unix 上找到。curses
因此,用户与curses
库链接并想知道为什么代码核心转储。问题是,getch()
实际使用的假设是正确的初始化已经完成,而正确的初始化没有完成。事实上,这可能不是我们需要的例行程序。
在 Solaris 上,有一些选项可以nm
告诉您库名称,甚至库中包含符号的目标文件(这些-r
用于库名称和-R
库中的对象)。
也要小心 C++ 错误的名称。该ortho2
示例显然不是 C++ 损坏的。
如果它是一个标准函数,可能是 ortho2,手册页会告诉你它在哪个库中。
我有一个小查找脚本。输入查找 func_name
#!/bin/csh
foreach i (*.o *.a *.so)
echo $i
nm $i | grep -i $1
end