我在运行Irix 6.5的SGI上使用FORTRAN和C进行编程,但这应该适用于所有类Unix系统。当我收到“未解决的文本符号”链接错误时,如何找到需要链接到我的程序的库?这是我从链接器中看到的一个例子:
ld32: ERROR 33 Unresolved text symbol "ortho2_" -- first referenced by ./libfoo.a
我是否只需知道需要哪些库,或者是否有某些工具或命令可以帮助我解决这个问题?
答案 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