5

例如,我正在尝试使用 GLFW3,它会向我抛出以下错误

x11_init.c:-1: 错误:未定义对“XIQueryVersion”的引用。

我只知道它与 X11 有关,但我怎么知道我必须链接哪个库?你将如何解决这个问题?

4

4 回答 4

7

您可以使用nm列出系统库中定义的符号,以查找哪个包含您缺少的符号:

find /usr/lib/ -type f -name \*.a \
  -exec nm -gAC --defined-only {} 2> /dev/null \; \
    | grep \ XIQueryVersion

哪个输出:

/usr/lib/x86_64-linux-gnu/libXi.a:XIQueryVersion.o:00000110 T XIQueryVersion

然后你知道你必须链接libXi.a,当然你可以调整库路径和符号名称,这只有在你的系统中已经有正确的库时才有效。

于 2013-05-16T13:03:13.040 回答
5

我将按以下顺序进行:

  1. 查看X11 文档,看看他们是否告诉您链接哪个库以获得此功能
  2. 如果您能找到对此库的引用,请在网上查看
  3. 在 X11 库上使用nm以查看哪个包含此引用

(嘘……这是libxi

于 2013-05-16T12:47:12.310 回答
1

我遇到了类似的链接错误。我的错误是:

/usr/local/lib/libglfw3.a(x11_init.c.o): In function `initExtensions':
x11_init.c:(.text+0x16d3): undefined reference to `XIQueryVersion'
/usr/local/lib/libglfw3.a(x11_window.c.o): In function `createWindow':
x11_window.c:(.text+0x6de): undefined reference to `XISelectEvents'

但是因为我想要Cmake为所需的链接库链接标志,所以我花了一段时间才这样做。编译基于 glfw 的程序所需的外部库是:

Requires.private:  x11 xrandr xi xxf86vm gl

线程显示了如何找到编译基于 glfw 的程序所需的这些库。

因为,我花了 2-3 个小时为上述附加链接库寻找 Cmake 链接标志。我认为这里值得一提的是帮助别人。

主要是因为我上面提到的错误,我只需要一个 cmake 链接标志xi,但为了完整起见,我为所有这些都提到了,即x11 xrandr xi xxf86vm. 这是我CMakeLists.txt文件中的片段:

include_directories(
    ./src
    ${X11_xf86vmode_INCLUDE_PATH}
    ${X11_Xrandr_INCLUDE_PATH}
    ${X11_Xinput_INCLUDE_PATH}
)

    target_link_libraries(
        ${GLFW_LIBRARIES}
        ${X11_LIBRARIES}
        ${X11_Xxf86vm_LIB}
        ${X11_Xrandr_LIB}
        ${X11_Xinput_LIB}
    )

我从这个链接中提取了这些标志。希望,它会为其他人节省时间。享受!

于 2014-05-22T15:34:12.537 回答
0

我在尝试构建 OpenGL 教程代码时遇到了这个错误。libxi-dev我通过卸载软件包来修复它。

我首先清理构建目录

cd build/
rm -r ./*

然后删除 libxi-dev 包

sudo apt-get remove libxi-dev
sudo apt-get autoremove

并通过以下方式重建项目

cd build/
cmake .. # My ogl directory
make all

然后成功。(实际上我不知道根本原因是什么,但它对我有用。)

于 2019-01-25T13:17:38.960 回答