“未解决的文本符号” - 如何找到正确的库

时间:2009-07-08 19:51:23

标签: c compilation x11

请原谅新手问题,我的C非常非常生疏。 试图从http://www.leftfield.org/~dd/sw.html构建xrunclient,在IRIX64上,我遇到了:

ld32:错误:33:未解决的文字符号“XOpenDisplay”

我认为这是因为它无法找到合适的库,但它找到了没有投诉的头文件。如何识别哪个库已定义该例程,以便确保它在库路径中?

3 个答案:

答案 0 :(得分:3)

教导男人钓鱼:

nm -o /usr/lib/lib*.a 2>/dev/null | 
grep  XOpenDisplay | 
grep -w T

这是做什么的

  1. /usr/lib中询问所有库中的符号。 (在64位系统上,您可能需要检查/usr/lib64。)-o选项不仅会打印符号,还会打印它来自的文件名。

  2. 抓住您关注的符号:XOpenDisplay

  3. 文本部分中对该符号的定义进行Grep - 孤独Tnm(1)如何在文字部分。我可能还尝试grep -w [TD]来获取文字或数据。

  4. 答案有点令人惊讶:

    /usr/lib/libSDL.a:SDL_x11dyn.o:00000380 T XOpenDisplay
    /usr/lib/libX11.a:OpenDis.o:00000420 T XOpenDisplay
    

    我不确定-lSDL是什么(如果我关心我会谷歌),但有-lX11和生命一样大。

    现在你可以找到你想要的任何缺失符号: - )

答案 1 :(得分:1)

答案是libX11.so - 它包含基本的Xlib例程,你可以告诉它这是一个Xlib例程,因为它以普通的“X”开头。如果它以“Xt”开头,那么你就知道它是Xt小部件集中的一个方法。

我不相信这个库的名称在15年以上发生了变化,所以书中显示的编译命令应该对你有用。我相信库名称也列在X例程的联机帮助页中(这当然意味着您必须提供联机帮助页,而不是每个人都这样做。)

除此之外,grep可能是你最好的选择,虽然在/ usr / lib中的grepping会打开对函数和声明的引用,所以这可能没用。还有一个命令行实用程序(你在Linux上运行,对吗?),它将显示.so的内容,这也可能很有用。

编辑:啊,Irix,不是Linux;在第一次阅读时没有注意到。我认为最好的方法是找到联机帮助页。

答案 2 :(得分:0)

X11年后,我可以具体揭露与IRIX有关的问题的答案。

CC mycode.cpp -lX11

谁会认为有人会在2020年继续寻找这些信息:)