例如我正在尝试使用GLFW3,它会向我抛出以下错误
x11_init.c:-1:错误:对XIQueryVersion的未定义引用。
我只知道它与X11有关但我怎么知道我要链接哪个库?你会如何解决这个问题?
答案 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)
我会按此顺序进行:
nm
以查看哪一个包含此引用(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
然后成功。 (实际上,我不知道根本原因是什么,但是对我有用。)