如何链接未知库

时间:2013-05-16 12:44:42

标签: c++

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

  

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

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

4 个答案:

答案 0 :(得分: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,当然您可以调整库路径和符号名称,只有在系统中已有合适的库时才能使用。

答案 1 :(得分:5)

我会按此顺序进行:

  1. 查看 X11 doc ,了解他们是否告诉您链接哪个lib以获取此功能
  2. 如果您能找到对此lib
  3. 的引用,请查看 web
  4. 在X11库中使用nm以查看哪一个包含此引用
  5. (shhhhhh ......它是libxi

答案 2 :(得分: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

This线程显示了如何找到编译基于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}
    )

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

答案 3 :(得分: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

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