Linux查找glxext.h函数的对象 - >找不到正确的.so - > “未定义参考”

时间:2014-10-28 14:50:07

标签: c++ opengl

我的应用程序使用glxext.h中的函数(例如/usr/include/GL/glxext.h),但似乎我没有链接到正确的库。

哪个库/编译单元包含匹配功能?

我已经与以下图书馆建立了联系:

-lopengl -lcuda -lcudart -lGL -lglut -lGLEW -lGLU -lX11 -lXNVCtrl -lXxf86vm -lXi -lXmu -lXext

输出

undefined reference to `glXEnumerateVideoCaptureDevicesNV'
undefined reference to `glXLockVideoCaptureDeviceNV'
undefined reference to `glXBindVideoCaptureDeviceNV'

我认为这可能只是找到要链接的正确的lib。我找到了可能包含正确组件的LWJGL。

2 个答案:

答案 0 :(得分:2)

此功能是GLX_NV_video_capture GLX扩展的一部分。如果您尝试与他们建立关联并获取-lGL中未找到此功能的报告,则很可能意味着您的GLX没有此扩展程序。您可以使用glxinfo|grep NV_video_capture命令验证该内容。

由于可能缺少扩展,因此通常建议首先使用glXQueryExtensionsString查询支持的扩展(这将返回支持空格的支持GLX扩展列表),然后,如果支持您需要的扩展,请使用{{ 1}}获取指向您需要的每个函数的指针。如果您要静态链接扩展程序功能,您的程序将无法在没有此扩展程序的任何其他实施程序上运行。

答案 1 :(得分:0)

在keltar的一些非常有用的输入后,我开始调查我的GL.so没有包含正确功能的原因。

确实应该是大多数现代GL.so对于nvidia机器(来自NVIDIA 190.XX驱动程序@ 2011和前进),所以它应该在我的机器上(使用GTX980的现代桌面)。

运行:

jimmy@jimmy-minipc:/$ sudo find -name libGL.so | xargs nm -D | grep glXEnum
0000000000080240 T glXEnumerateVideoCaptureDevicesNV
0000000000080e60 T glXEnumerateVideoDevicesNV
0006d910 T glXEnumerateVideoCaptureDevicesNV
0006e180 T glXEnumerateVideoDevicesNV
00044f89 T glXEnumerateVideoCaptureDevicesNV
00045a89 T glXEnumerateVideoDevicesNV

帮助我意识到我确实拥有所需的功能。这些位于

/usr/lib/nvidia-343/libGL.so 代替 /usr/lib/x86_64-linux-gnu/libGL.so

请注意,nvidia-343来自我机器上最新的驱动程序更新。

虽然keltar的getProcAddress解决方案在未知的部署环境中可能更正确,但我并不能完全满足我的需求,因为它需要大量的代码重写,而且我还有相当可控的部署环境。