3

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

ld32:错误:33:未解析的文本符号“XOpenDisplay”

我认为这是因为它找不到合适的库,但它毫无怨言地找到了头文件。如何确定哪个库定义了该例程,以便确保它位于库路径中?

4

3 回答 3

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]

答案有点出人意料:

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

我不确定是什么-lSDL(如果我在乎的话,我会用谷歌搜索),但它-lX11和生命一样大。

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

于 2009-07-09T02:15:55.970 回答
1

答案是 libX11.so——它包含基本的 Xlib 例程,您可以说这是一个 Xlib 例程,因为它以简单的“X”开头。如果它以“Xt”开头,那么您就会知道它是 Xt 小部件集中的一个方法。

我不相信这个库的名称已经在 15 年多的时间里改变了,所以书中显示的编译命令应该适合你。我相信库名称也列在 X 例程的手册页中(这当然意味着您必须有可用的手册页,而不是每个人都有)。

除此之外,grep 可能是您最好的选择,尽管在 /usr/lib 上进行 grep 会同时显示对函数的引用和声明,因此这可能没有用。还有一个命令行实用程序(您在 Linux 上运行,对吗?),它将显示 .so 的内容,这也可能很有用。

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

于 2009-07-08T20:00:52.547 回答
0

X11 年后,我可以揭示这个与 IRIX 相关的问题答案。

CC mycode.cpp -lX11

谁会想到 2020 年还有人在寻找这些信息 :)

于 2020-08-30T15:05:13.817 回答