Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ glxext.h函数的Linux查找对象->;找不到正确的。因此->&引用;“未定义引用”;_C++_Opengl - Fatal编程技术网

C++ glxext.h函数的Linux查找对象->;找不到正确的。因此->&引用;“未定义引用”;

C++ glxext.h函数的Linux查找对象->;找不到正确的。因此->&引用;“未定义引用”;,c++,opengl,C++,Opengl,我的应用程序正在使用glxext.h(ex/usr/include/GL/glxext.h)中的函数,但是我似乎没有链接到正确的库 哪个库/编译单元包含匹配功能 我已经链接到以下库: -lopengl -lcuda -lcudart -lGL -lglut -lGLEW -lGLU -lX11 -lXNVCtrl -lXxf86vm -lXi -lXmu -lXext 输出 undefined reference to `glXEnumerateVideoCaptureDevicesNV' u

我的应用程序正在使用glxext.h(ex/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可能包含正确的组件。

此函数是GLX扩展的一部分。如果您尝试与它们链接,并得到报告称在
-lGL
中找不到此函数,则很可能意味着您的GLX没有此扩展。您可以使用
glxinfo | grep NV_video_capture
命令验证这一点


由于可能缺少扩展名,通常建议首先使用
glXQueryExtensionsString
(它将返回以空格分隔的支持的GLX扩展名列表)查询支持的扩展名,然后,如果支持所需的扩展名,则使用
glXGetProcAddress
获取指向所需每个函数的指针。如果静态链接扩展函数,您的程序将无法在没有此扩展的任何其他实现上运行。

在keltar提供了一些非常有用的输入后,我开始调查为什么我的GL.so没有包含正确的功能

事实上,对于nvidia机器(从nvidia 190.XX drivers@2011及以后版本),它应该在最现代的GL.so中,所以它确实应该在我的机器上(带有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解决方案在未知的部署环境中可能更为正确,但我并不能完全满足我的需要,因为它需要大量的代码重写,而且我还可以完全控制部署环境。

这根本不是问题。一些实现(更确切地说是驱动程序和图形硬件的组合)支持一些扩展,而另一些则不支持——这就是为什么它被称为扩展。例如,我使用intel graphics的工作计算机没有NV_视频捕捉,而使用nvidia graphics的home desktop有。我认为,即使我当前的开发机器没有所需的硬件和驱动程序,我希望它能够为部署机器设置一个构建,这些机器有使用这些扩展的驱动程序和硬件。。。因此,我只需要一个包含此功能的开发库(在本例中,您会提示它是另一个libGL.so库),即使我无法实际执行应用程序的某些部分。续:根据您的输入,我是否可以假设libGL.so是必需的,并且会附带“正确”的驱动程序更新显卡?在我的例子中,这将是Nvidia quadro图形卡(我目前正在Geforce上开发)的图形驱动程序。“NV_视频_捕获,而使用Nvidia图形的家庭桌面则会。”-我只在使用离散nvidia图形的桌面计算机上工作,然后我似乎没有。这正是为什么您需要在运行时使用
glXGetProcAddress
,而不是直接链接。虽然最新的nvidia驱动程序即使没有捕获硬件,也应该具有此功能,但这不是一项要求,其他驱动程序(如AMD)可能没有。但我的一个GL.so LIB中似乎有该库:jimmy@jimmy-minipc:/$sudo find-name GL.so | xargs nm-D | grep glXEnum 0000000000080240 T glXEnumerateVideoCaptureDevicesNV。。。。。。。