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