Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.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++ OpenGL EGL在docker中的eglGetDisplay处返回0x300c(EGL_BAD_参数)_C++_Docker_Ubuntu_Opengl_Egl - Fatal编程技术网

C++ OpenGL EGL在docker中的eglGetDisplay处返回0x300c(EGL_BAD_参数)

C++ OpenGL EGL在docker中的eglGetDisplay处返回0x300c(EGL_BAD_参数),c++,docker,ubuntu,opengl,egl,C++,Docker,Ubuntu,Opengl,Egl,我试图运行一个简单的示例,在docker容器中设置EGL上下文。但是,我一直收到以下错误消息: Detected 0 devices terminate called after throwing an instance of 'std::runtime_error' what(): EGL error 0x300c at eglGetDisplay Aborted 基本上,eglquerydevicext返回0,eglGetPlatformDisplayEXT返回错误代码0x300c(

我试图运行一个简单的示例,在docker容器中设置EGL上下文。但是,我一直收到以下错误消息:

Detected 0 devices
terminate called after throwing an instance of 'std::runtime_error'
  what():  EGL error 0x300c at eglGetDisplay
Aborted
基本上,
eglquerydevicext
返回0,
eglGetPlatformDisplayEXT
返回错误代码
0x300c(EGL\u BAD\u参数)

我试过:

  • MacBookPro上的Ubuntu 16.04 docker
  • Ubuntu16.04 docker安装在带有Nvidia GPU的Ubuntu16.04服务器上
  • 在这些docker环境中,我使用
    apt get install libgl1 mesa dev
    apt get install libgl1 mesa dev
    安装了
    openGL
    ELG
    。CMake可以找到组件
    GL::GL
    EGL::EGL

    我尝试了手动链接到
    libEGL.so
    ,也尝试了在CMake中使用
    find_package

    这快把我逼疯了!我不明白为什么EGL不能检测设备?如何解决此错误

    这是我的全部代码。我还尝试了
    EGLDisplay eglDpy=eglGetDisplay(EGL\u DEFAULT\u DISPLAY)这给了我同样的错误。谢谢

    #include <EGL/egl.h>
    #include <EGL/eglext.h>
    
    
    void assertEGLError(const std::string& msg) {
        EGLint error = eglGetError();
    
        if (error != EGL_SUCCESS) {
            std::stringstream s;
            s << "EGL error 0x" << std::hex << error << " at " << msg;
            throw std::runtime_error(s.str());
        }
    }
    
    
    int main(int argc, char *argv[])
    {
        // 1. Initialize EGL
    //    EGLDisplay eglDpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);
    
        int deviceID = 0;  // TODO hardcode
    
        EGLDisplay eglDpy;
        EGLConfig config;
        EGLContext context;
        EGLint num_config;
    
        static const int MAX_DEVICES = 16;
        EGLDeviceEXT eglDevs[MAX_DEVICES];
        EGLint numDevices;
    
        PFNEGLQUERYDEVICESEXTPROC eglQueryDevicesEXT =
                (PFNEGLQUERYDEVICESEXTPROC)eglGetProcAddress("eglQueryDevicesEXT");
    
        eglQueryDevicesEXT(MAX_DEVICES, eglDevs, &numDevices);
        printf("Detected %d devices\n", numDevices);
        PFNEGLGETPLATFORMDISPLAYEXTPROC eglGetPlatformDisplayEXT =
                (PFNEGLGETPLATFORMDISPLAYEXTPROC)eglGetProcAddress("eglGetPlatformDisplayEXT");
    
        // Choose device by deviceID
        eglDpy = eglGetPlatformDisplayEXT(EGL_PLATFORM_DEVICE_EXT, eglDevs[deviceID], nullptr);
    
        assertEGLError("eglGetDisplay");
    
        return 0;
    }
    
    #包括
    #包括
    void assertegleror(const std::string和msg){
    EGLint error=eglGetError();
    如果(错误!=EGL_成功){
    std::strings;
    
    天啊,我终于解决了这个问题。原来我链接到了服务器上的错误库

    我在这篇文章中找到了答案:

    关键是链接到
    /usr/lib/nvidia-410/
    中的库,而不是系统默认的
    /usr/local/lib/x86_64-linux-gnu/libEGL.so

    新的
    CMake
    有效:

    target_link_libraries(sandbox PRIVATE /usr/lib/nvidia-410/libEGL.so)
    target_link_libraries(sandbox PRIVATE /usr/lib/nvidia-410/libGLX.so)
    target_link_libraries(sandbox PRIVATE /usr/lib/nvidia-410/libOpenGL.so)
    
    以前,我使用CMake的
    findOpenGL
    搜索链接库,但不起作用

    find_package(OpenGL REQUIRED COMPONENTS OpenGL EGL GLX)
    include_directories(${OPENGL_INCLUDE_DIRS})
    if(OPENGL_FOUND)
       message("Found OpenGL in the current environment!")
    else()
       message("Error: No OpenGL found.")
    endif()
    
    message("OpenGL include dirs" )
    message("${OPENGL_INCLUDE_DIR}")
    message("EGL include dirs" )
    message("${OPENGL_EGL_INCLUDE_DIRS}")
    
    if (OpenGL_EGL_FOUND)
       message("EGL Found!")
    else()
       message("EGL Not Found!")
    endif()
    
    message(${OPENGL_egl_LIBRARY})
    message(${OPENGL_glx_LIBRARY})
    message(${OPENGL_opengl_LIBRARY}
    
    再次注意,这不起作用!!

    /usr/local/lib/x86_64-linux-gnu/libEGL.so
    /usr/local/lib/x86_64-linux-gnu/libGLX.so
    /usr/local/lib/x86_64-linux-gnu/libOpenGL.so