"Missing GL version" 来自 glewInit() 使用 EGL?

"Missing GL version" from glewInit() using EGL?

我只是尝试 运行 这个:

int main(int argc, char **argv) {

EGLDisplay display;
EGLConfig config;
EGLContext context;
EGLint num_config;

display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
if (display == EGL_NO_DISPLAY)
{
    std:: cout << "ERROR: EGL could not be initialized"<< std::endl;
    exit(EXIT_FAILURE);
}
if (!eglInitialize(display, nullptr, nullptr))
{
    std:: cout << "ERROR: Could not start EGL display connection"<< std::endl;
    exit(EXIT_FAILURE);
}
if (eglChooseConfig(display, nullptr, &config, 1, &num_config) != EGL_TRUE)
{
    std:: cout << "ERROR: Configuration selection failed" << std::endl;
    exit(EXIT_FAILURE);
}
eglBindAPI(EGL_OPENGL_API);
context = eglCreateContext(display, config, EGL_NO_CONTEXT, NULL);
if (eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, context) != EGL_TRUE) {
    std:: cout << "ERROR: Display was not made current one"<< std::endl;
    exit(EXIT_FAILURE);
}

GLenum err = glewInit();
if (GLEW_OK != err)
{
    std:: cout << "GLEW Error: " << glewGetErrorString(err) << std::endl;
    exit(EXIT_FAILURE);
}
// ... some code here
}

但是当运行我有:

GLEW Error: Missing GL version

看起来我的 glewInit() 在 GL 上下文中失败了,但我不明白为什么,因为我的 glewInit() 是在创建上下文之后调用的。而且 EGL 没有错误。

此代码的目的是能够在没有任何 window 的情况下拥有 Opengl 上下文。这段代码在过去有效,但自从我用 Nvidia 384 升级我的 Ubuntu 17.10,在 Quadro K2000M 上工作后就没有了。

这是我的 glxinfo:

glxinfo 
name of display: :1
display: :1  screen: 0
direct rendering: Yes
server glx vendor string: NVIDIA Corporation
server glx version string: 1.4
server glx extensions:
    GLX_ARB_context_flush_control, GLX_ARB_create_context, 
    GLX_ARB_create_context_profile, GLX_ARB_create_context_robustness, 
    GLX_ARB_fbconfig_float, GLX_ARB_multisample, GLX_EXT_buffer_age, 
    GLX_EXT_create_context_es2_profile, GLX_EXT_create_context_es_profile, 
    GLX_EXT_framebuffer_sRGB, GLX_EXT_import_context, GLX_EXT_libglvnd, 
    GLX_EXT_stereo_tree, GLX_EXT_swap_control, GLX_EXT_swap_control_tear, 
    GLX_EXT_texture_from_pixmap, GLX_EXT_visual_info, GLX_EXT_visual_rating, 
    GLX_NV_copy_buffer, GLX_NV_copy_image, GLX_NV_delay_before_swap, 
    GLX_NV_float_buffer, GLX_NV_robustness_video_memory_purge, 
    GLX_NV_swap_group, GLX_NV_video_capture, GLX_SGIX_fbconfig, 
    GLX_SGIX_pbuffer, GLX_SGI_swap_control, GLX_SGI_video_sync
client glx vendor string: NVIDIA Corporation
client glx version string: 1.4
client glx extensions:
    GLX_ARB_context_flush_control, GLX_ARB_create_context, 
    GLX_ARB_create_context_profile, GLX_ARB_create_context_robustness, 
    GLX_ARB_fbconfig_float, GLX_ARB_get_proc_address, GLX_ARB_multisample, 
    GLX_EXT_buffer_age, GLX_EXT_create_context_es2_profile, 
    GLX_EXT_create_context_es_profile, GLX_EXT_fbconfig_packed_float, 
    GLX_EXT_framebuffer_sRGB, GLX_EXT_import_context, GLX_EXT_stereo_tree, 
    GLX_EXT_swap_control, GLX_EXT_swap_control_tear, 
    GLX_EXT_texture_from_pixmap, GLX_EXT_visual_info, GLX_EXT_visual_rating, 
    GLX_NV_copy_buffer, GLX_NV_copy_image, GLX_NV_delay_before_swap, 
    GLX_NV_float_buffer, GLX_NV_multisample_coverage, GLX_NV_present_video, 
    GLX_NV_robustness_video_memory_purge, GLX_NV_swap_group, 
    GLX_NV_video_capture, GLX_NV_video_out, GLX_SGIX_fbconfig, 
    GLX_SGIX_pbuffer, GLX_SGI_swap_control, GLX_SGI_video_sync
GLX version: 1.4
GLX extensions:
    GLX_ARB_context_flush_control, GLX_ARB_create_context, 
    GLX_ARB_create_context_profile, GLX_ARB_create_context_robustness, 
    GLX_ARB_fbconfig_float, GLX_ARB_get_proc_address, GLX_ARB_multisample, 
    GLX_EXT_buffer_age, GLX_EXT_create_context_es2_profile, 
    GLX_EXT_create_context_es_profile, GLX_EXT_framebuffer_sRGB, 
    GLX_EXT_import_context, GLX_EXT_stereo_tree, GLX_EXT_swap_control, 
    GLX_EXT_swap_control_tear, GLX_EXT_texture_from_pixmap, 
    GLX_EXT_visual_info, GLX_EXT_visual_rating, GLX_NV_copy_buffer, 
    GLX_NV_copy_image, GLX_NV_delay_before_swap, GLX_NV_float_buffer, 
    GLX_NV_robustness_video_memory_purge, GLX_NV_swap_group, 
    GLX_NV_video_capture, GLX_SGIX_fbconfig, GLX_SGIX_pbuffer, 
    GLX_SGI_swap_control, GLX_SGI_video_sync
OpenGL vendor string: NVIDIA Corporation
OpenGL renderer string: Quadro M2000M/PCIe/SSE2
OpenGL core profile version string: 4.5.0 NVIDIA 384.90
OpenGL core profile shading language version string: 4.50 NVIDIA
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
OpenGL core profile extensions:
    GL_AMD_multi_draw_indirect, GL_AMD_seamless_cubemap_per_texture, 
    GL_ARB_ES2_compatibility, GL_ARB_ES3_1_compatibility, 
    GL_ARB_ES3_2_compatibility, GL_ARB_ES3_compatibility, 
    GL_ARB_arrays_of_arrays, GL_ARB_base_instance, GL_ARB_bindless_texture, 
    GL_ARB_blend_func_extended, GL_ARB_buffer_storage, GL_ARB_cl_event, 
    GL_ARB_clear_buffer_object, GL_ARB_clear_texture, GL_ARB_clip_control, 
    GL_ARB_color_buffer_float, GL_ARB_compressed_texture_pixel_storage, 
    GL_ARB_compute_shader, GL_ARB_compute_variable_group_size, 
    GL_ARB_conditional_render_inverted, GL_ARB_conservative_depth, 
    GL_ARB_copy_buffer, GL_ARB_copy_image, GL_ARB_cull_distance, 
    GL_ARB_debug_output, GL_ARB_depth_buffer_float, GL_ARB_depth_clamp, 
    GL_ARB_depth_texture, GL_ARB_derivative_control, 
    GL_ARB_direct_state_access, GL_ARB_draw_buffers, 
    GL_ARB_draw_buffers_blend, GL_ARB_draw_elements_base_vertex, 
    GL_ARB_draw_indirect, GL_ARB_draw_instanced, GL_ARB_enhanced_layouts, 
    GL_ARB_explicit_attrib_location, GL_ARB_explicit_uniform_location, 
    GL_ARB_fragment_coord_conventions, GL_ARB_fragment_layer_viewport, 
    GL_ARB_fragment_program, GL_ARB_fragment_program_shadow, 
    GL_ARB_fragment_shader, GL_ARB_framebuffer_no_attachments, 
    GL_ARB_framebuffer_object, GL_ARB_framebuffer_sRGB, 
    GL_ARB_geometry_shader4, GL_ARB_get_program_binary, 
    GL_ARB_get_texture_sub_image, GL_ARB_gl_spirv, GL_ARB_gpu_shader5, 
    GL_ARB_gpu_shader_fp64, GL_ARB_gpu_shader_int64, GL_ARB_half_float_pixel, 
    GL_ARB_half_float_vertex, GL_ARB_imaging, GL_ARB_indirect_parameters, 
    GL_ARB_instanced_arrays, GL_ARB_internalformat_query, 
    GL_ARB_internalformat_query2, GL_ARB_invalidate_subdata, 
    GL_ARB_map_buffer_alignment, GL_ARB_map_buffer_range, GL_ARB_multi_bind, 
    GL_ARB_multi_draw_indirect, GL_ARB_multisample, GL_ARB_multitexture, 
    GL_ARB_occlusion_query, GL_ARB_occlusion_query2, 
    GL_ARB_parallel_shader_compile, GL_ARB_pipeline_statistics_query, 
    GL_ARB_pixel_buffer_object, GL_ARB_point_parameters, GL_ARB_point_sprite, 
    GL_ARB_program_interface_query, GL_ARB_provoking_vertex, 
    GL_ARB_query_buffer_object, GL_ARB_robust_buffer_access_behavior, 
    GL_ARB_robustness, GL_ARB_sample_shading, GL_ARB_sampler_objects, 
    GL_ARB_seamless_cube_map, GL_ARB_seamless_cubemap_per_texture, 
    GL_ARB_separate_shader_objects, GL_ARB_shader_atomic_counter_ops, 
    GL_ARB_shader_atomic_counters, GL_ARB_shader_ballot, 
    GL_ARB_shader_bit_encoding, GL_ARB_shader_clock, 
    GL_ARB_shader_draw_parameters, GL_ARB_shader_group_vote, 
    GL_ARB_shader_image_load_store, GL_ARB_shader_image_size, 
    GL_ARB_shader_objects, GL_ARB_shader_precision, 
    GL_ARB_shader_storage_buffer_object, GL_ARB_shader_subroutine, 
    GL_ARB_shader_texture_image_samples, GL_ARB_shader_texture_lod, 
    GL_ARB_shading_language_100, GL_ARB_shading_language_420pack, 
    GL_ARB_shading_language_include, GL_ARB_shading_language_packing, 
    GL_ARB_shadow, GL_ARB_sparse_buffer, GL_ARB_sparse_texture, 
    GL_ARB_stencil_texturing, GL_ARB_sync, GL_ARB_tessellation_shader, 
    GL_ARB_texture_barrier, GL_ARB_texture_border_clamp, 
    GL_ARB_texture_buffer_object, GL_ARB_texture_buffer_object_rgb32, 
    GL_ARB_texture_buffer_range, GL_ARB_texture_compression, 
    GL_ARB_texture_compression_bptc, GL_ARB_texture_compression_rgtc, 
    GL_ARB_texture_cube_map, GL_ARB_texture_cube_map_array, 
    GL_ARB_texture_env_add, GL_ARB_texture_env_combine, 
    GL_ARB_texture_env_crossbar, GL_ARB_texture_env_dot3, 
    GL_ARB_texture_float, GL_ARB_texture_gather, 
    GL_ARB_texture_mirror_clamp_to_edge, GL_ARB_texture_mirrored_repeat, 
    GL_ARB_texture_multisample, GL_ARB_texture_non_power_of_two, 
    GL_ARB_texture_query_levels, GL_ARB_texture_query_lod, 
    GL_ARB_texture_rectangle, GL_ARB_texture_rg, GL_ARB_texture_rgb10_a2ui, 
    GL_ARB_texture_stencil8, GL_ARB_texture_storage, 
    GL_ARB_texture_storage_multisample, GL_ARB_texture_swizzle, 
    GL_ARB_texture_view, GL_ARB_timer_query, GL_ARB_transform_feedback2, 
    GL_ARB_transform_feedback3, GL_ARB_transform_feedback_instanced, 
    GL_ARB_transform_feedback_overflow_query, GL_ARB_transpose_matrix, 
    GL_ARB_uniform_buffer_object, GL_ARB_vertex_array_bgra, 
    GL_ARB_vertex_array_object, GL_ARB_vertex_attrib_64bit, 
    GL_ARB_vertex_attrib_binding, GL_ARB_vertex_buffer_object, 
    GL_ARB_vertex_program, GL_ARB_vertex_shader, 
    GL_ARB_vertex_type_10f_11f_11f_rev, GL_ARB_vertex_type_2_10_10_10_rev, 
    GL_ARB_viewport_array, GL_ARB_window_pos, GL_ATI_draw_buffers, 
    GL_ATI_texture_float, GL_ATI_texture_mirror_once, 
    GL_EXTX_framebuffer_mixed_formats, GL_EXT_Cg_shader, GL_EXT_abgr, 
    GL_EXT_bgra, GL_EXT_bindable_uniform, GL_EXT_blend_color, 
    GL_EXT_blend_equation_separate, GL_EXT_blend_func_separate, 
    GL_EXT_blend_minmax, GL_EXT_blend_subtract, GL_EXT_compiled_vertex_array, 
    GL_EXT_depth_bounds_test, GL_EXT_direct_state_access, 
    GL_EXT_draw_buffers2, GL_EXT_draw_instanced, GL_EXT_draw_range_elements, 
    GL_EXT_fog_coord, GL_EXT_framebuffer_blit, GL_EXT_framebuffer_multisample, 
    GL_EXT_framebuffer_multisample_blit_scaled, GL_EXT_framebuffer_object, 
    GL_EXT_framebuffer_sRGB, GL_EXT_geometry_shader4, 
    GL_EXT_gpu_program_parameters, GL_EXT_gpu_shader4, 
    GL_EXT_import_sync_object, GL_EXT_memory_object, GL_EXT_memory_object_fd, 
    GL_EXT_multi_draw_arrays, GL_EXT_packed_depth_stencil, 
    GL_EXT_packed_float, GL_EXT_packed_pixels, GL_EXT_pixel_buffer_object, 
    GL_EXT_point_parameters, GL_EXT_polygon_offset_clamp, 
    GL_EXT_provoking_vertex, GL_EXT_rescale_normal, GL_EXT_secondary_color, 
    GL_EXT_semaphore, GL_EXT_semaphore_fd, GL_EXT_separate_shader_objects, 
    GL_EXT_separate_specular_color, GL_EXT_shader_image_load_formatted, 
    GL_EXT_shader_image_load_store, GL_EXT_shader_integer_mix, 
    GL_EXT_shadow_funcs, GL_EXT_stencil_two_side, GL_EXT_stencil_wrap, 
    GL_EXT_texture3D, GL_EXT_texture_array, GL_EXT_texture_buffer_object, 
    GL_EXT_texture_compression_dxt1, GL_EXT_texture_compression_latc, 
    GL_EXT_texture_compression_rgtc, GL_EXT_texture_compression_s3tc, 
    GL_EXT_texture_cube_map, GL_EXT_texture_edge_clamp, 
    GL_EXT_texture_env_add, GL_EXT_texture_env_combine, 
    GL_EXT_texture_env_dot3, GL_EXT_texture_filter_anisotropic, 
    GL_EXT_texture_integer, GL_EXT_texture_lod, GL_EXT_texture_lod_bias, 
    GL_EXT_texture_mirror_clamp, GL_EXT_texture_object, GL_EXT_texture_sRGB, 
    GL_EXT_texture_sRGB_decode, GL_EXT_texture_shared_exponent, 
    GL_EXT_texture_storage, GL_EXT_texture_swizzle, GL_EXT_timer_query, 
    GL_EXT_transform_feedback2, GL_EXT_vertex_array, GL_EXT_vertex_array_bgra, 
    GL_EXT_vertex_attrib_64bit, GL_EXT_window_rectangles, 
    GL_EXT_x11_sync_object, GL_IBM_rasterpos_clip, 
    GL_IBM_texture_mirrored_repeat, GL_KHR_blend_equation_advanced, 
    GL_KHR_blend_equation_advanced_coherent, GL_KHR_context_flush_control, 
    GL_KHR_debug, GL_KHR_no_error, GL_KHR_robust_buffer_access_behavior, 
    GL_KHR_robustness, GL_KTX_buffer_region, GL_NVX_conditional_render, 
    GL_NVX_gpu_memory_info, GL_NVX_nvenc_interop, GL_NV_ES1_1_compatibility, 
    GL_NV_ES3_1_compatibility, GL_NV_alpha_to_coverage_dither_control, 
    GL_NV_bindless_multi_draw_indirect, 
    GL_NV_bindless_multi_draw_indirect_count, GL_NV_bindless_texture, 
    GL_NV_blend_equation_advanced, GL_NV_blend_equation_advanced_coherent, 
    GL_NV_blend_square, GL_NV_command_list, GL_NV_compute_program5, 
    GL_NV_conditional_render, GL_NV_copy_depth_to_color, GL_NV_copy_image, 
    GL_NV_deep_texture3D, GL_NV_depth_buffer_float, GL_NV_depth_clamp, 
    GL_NV_draw_texture, GL_NV_draw_vulkan_image, GL_NV_explicit_multisample, 
    GL_NV_fence, GL_NV_float_buffer, GL_NV_fog_distance, 
    GL_NV_fragment_program, GL_NV_fragment_program2, 
    GL_NV_fragment_program_option, GL_NV_framebuffer_multisample_coverage, 
    GL_NV_geometry_shader4, GL_NV_gpu_program4, GL_NV_gpu_program4_1, 
    GL_NV_gpu_program5, GL_NV_gpu_program5_mem_extended, 
    GL_NV_gpu_program_fp64, GL_NV_gpu_shader5, GL_NV_half_float, 
    GL_NV_internalformat_sample_query, GL_NV_light_max_exponent, 
    GL_NV_multisample_coverage, GL_NV_multisample_filter_hint, 
    GL_NV_occlusion_query, GL_NV_packed_depth_stencil, 
    GL_NV_parameter_buffer_object, GL_NV_parameter_buffer_object2, 
    GL_NV_path_rendering, GL_NV_pixel_data_range, GL_NV_point_sprite, 
    GL_NV_primitive_restart, GL_NV_register_combiners, 
    GL_NV_register_combiners2, GL_NV_robustness_video_memory_purge, 
    GL_NV_shader_atomic_counters, GL_NV_shader_atomic_float, 
    GL_NV_shader_atomic_int64, GL_NV_shader_buffer_load, 
    GL_NV_shader_storage_buffer_object, GL_NV_shader_thread_group, 
    GL_NV_shader_thread_shuffle, GL_NV_texgen_reflection, 
    GL_NV_texture_barrier, GL_NV_texture_compression_vtc, 
    GL_NV_texture_env_combine4, GL_NV_texture_multisample, 
    GL_NV_texture_rectangle, GL_NV_texture_shader, GL_NV_texture_shader2, 
    GL_NV_texture_shader3, GL_NV_transform_feedback, 
    GL_NV_transform_feedback2, GL_NV_uniform_buffer_unified_memory, 
    GL_NV_vdpau_interop, GL_NV_vertex_array_range, GL_NV_vertex_array_range2, 
    GL_NV_vertex_attrib_integer_64bit, GL_NV_vertex_buffer_unified_memory, 
    GL_NV_vertex_program, GL_NV_vertex_program1_1, GL_NV_vertex_program2, 
    GL_NV_vertex_program2_option, GL_NV_vertex_program3, GL_S3_s3tc, 
    GL_SGIS_generate_mipmap, GL_SGIS_texture_lod, GL_SGIX_depth_texture, 
    GL_SGIX_shadow, GL_SUN_slice_accum

OpenGL version string: 4.5.0 NVIDIA 384.90
OpenGL shading language version string: 4.50 NVIDIA
OpenGL context flags: (none)
OpenGL profile mask: (none)
OpenGL extensions:
    GL_AMD_multi_draw_indirect, GL_AMD_seamless_cubemap_per_texture, 
    GL_ARB_ES2_compatibility, GL_ARB_ES3_1_compatibility, 
    GL_ARB_ES3_2_compatibility, GL_ARB_ES3_compatibility, 
    GL_ARB_arrays_of_arrays, GL_ARB_base_instance, GL_ARB_bindless_texture, 
    GL_ARB_blend_func_extended, GL_ARB_buffer_storage, GL_ARB_cl_event, 
    GL_ARB_clear_buffer_object, GL_ARB_clear_texture, GL_ARB_clip_control, 
    GL_ARB_color_buffer_float, GL_ARB_compatibility, 
    GL_ARB_compressed_texture_pixel_storage, GL_ARB_compute_shader, 
    GL_ARB_compute_variable_group_size, GL_ARB_conditional_render_inverted, 
    GL_ARB_conservative_depth, GL_ARB_copy_buffer, GL_ARB_copy_image, 
    GL_ARB_cull_distance, GL_ARB_debug_output, GL_ARB_depth_buffer_float, 
    GL_ARB_depth_clamp, GL_ARB_depth_texture, GL_ARB_derivative_control, 
    GL_ARB_direct_state_access, GL_ARB_draw_buffers, 
    GL_ARB_draw_buffers_blend, GL_ARB_draw_elements_base_vertex, 
    GL_ARB_draw_indirect, GL_ARB_draw_instanced, GL_ARB_enhanced_layouts, 
    GL_ARB_explicit_attrib_location, GL_ARB_explicit_uniform_location, 
    GL_ARB_fragment_coord_conventions, GL_ARB_fragment_layer_viewport, 
    GL_ARB_fragment_program, GL_ARB_fragment_program_shadow, 
    GL_ARB_fragment_shader, GL_ARB_framebuffer_no_attachments, 
    GL_ARB_framebuffer_object, GL_ARB_framebuffer_sRGB, 
    GL_ARB_geometry_shader4, GL_ARB_get_program_binary, 
    GL_ARB_get_texture_sub_image, GL_ARB_gl_spirv, GL_ARB_gpu_shader5, 
    GL_ARB_gpu_shader_fp64, GL_ARB_gpu_shader_int64, GL_ARB_half_float_pixel, 
    GL_ARB_half_float_vertex, GL_ARB_imaging, GL_ARB_indirect_parameters, 
    GL_ARB_instanced_arrays, GL_ARB_internalformat_query, 
    GL_ARB_internalformat_query2, GL_ARB_invalidate_subdata, 
    GL_ARB_map_buffer_alignment, GL_ARB_map_buffer_range, GL_ARB_multi_bind, 
    GL_ARB_multi_draw_indirect, GL_ARB_multisample, GL_ARB_multitexture, 
    GL_ARB_occlusion_query, GL_ARB_occlusion_query2, 
    GL_ARB_parallel_shader_compile, GL_ARB_pipeline_statistics_query, 
    GL_ARB_pixel_buffer_object, GL_ARB_point_parameters, GL_ARB_point_sprite, 
    GL_ARB_program_interface_query, GL_ARB_provoking_vertex, 
    GL_ARB_query_buffer_object, GL_ARB_robust_buffer_access_behavior, 
    GL_ARB_robustness, GL_ARB_sample_shading, GL_ARB_sampler_objects, 
    GL_ARB_seamless_cube_map, GL_ARB_seamless_cubemap_per_texture, 
    GL_ARB_separate_shader_objects, GL_ARB_shader_atomic_counter_ops, 
    GL_ARB_shader_atomic_counters, GL_ARB_shader_ballot, 
    GL_ARB_shader_bit_encoding, GL_ARB_shader_clock, 
    GL_ARB_shader_draw_parameters, GL_ARB_shader_group_vote, 
    GL_ARB_shader_image_load_store, GL_ARB_shader_image_size, 
    GL_ARB_shader_objects, GL_ARB_shader_precision, 
    GL_ARB_shader_storage_buffer_object, GL_ARB_shader_subroutine, 
    GL_ARB_shader_texture_image_samples, GL_ARB_shader_texture_lod, 
    GL_ARB_shading_language_100, GL_ARB_shading_language_420pack, 
    GL_ARB_shading_language_include, GL_ARB_shading_language_packing, 
    GL_ARB_shadow, GL_ARB_sparse_buffer, GL_ARB_sparse_texture, 
    GL_ARB_stencil_texturing, GL_ARB_sync, GL_ARB_tessellation_shader, 
    GL_ARB_texture_barrier, GL_ARB_texture_border_clamp, 
    GL_ARB_texture_buffer_object, GL_ARB_texture_buffer_object_rgb32, 
    GL_ARB_texture_buffer_range, GL_ARB_texture_compression, 
    GL_ARB_texture_compression_bptc, GL_ARB_texture_compression_rgtc, 
    GL_ARB_texture_cube_map, GL_ARB_texture_cube_map_array, 
    GL_ARB_texture_env_add, GL_ARB_texture_env_combine, 
    GL_ARB_texture_env_crossbar, GL_ARB_texture_env_dot3, 
    GL_ARB_texture_float, GL_ARB_texture_gather, 
    GL_ARB_texture_mirror_clamp_to_edge, GL_ARB_texture_mirrored_repeat, 
    GL_ARB_texture_multisample, GL_ARB_texture_non_power_of_two, 
    GL_ARB_texture_query_levels, GL_ARB_texture_query_lod, 
    GL_ARB_texture_rectangle, GL_ARB_texture_rg, GL_ARB_texture_rgb10_a2ui, 
    GL_ARB_texture_stencil8, GL_ARB_texture_storage, 
    GL_ARB_texture_storage_multisample, GL_ARB_texture_swizzle, 
    GL_ARB_texture_view, GL_ARB_timer_query, GL_ARB_transform_feedback2, 
    GL_ARB_transform_feedback3, GL_ARB_transform_feedback_instanced, 
    GL_ARB_transform_feedback_overflow_query, GL_ARB_transpose_matrix, 
    GL_ARB_uniform_buffer_object, GL_ARB_vertex_array_bgra, 
    GL_ARB_vertex_array_object, GL_ARB_vertex_attrib_64bit, 
    GL_ARB_vertex_attrib_binding, GL_ARB_vertex_buffer_object, 
    GL_ARB_vertex_program, GL_ARB_vertex_shader, 
    GL_ARB_vertex_type_10f_11f_11f_rev, GL_ARB_vertex_type_2_10_10_10_rev, 
    GL_ARB_viewport_array, GL_ARB_window_pos, GL_ATI_draw_buffers, 
    GL_ATI_texture_float, GL_ATI_texture_mirror_once, 
    GL_EXTX_framebuffer_mixed_formats, GL_EXT_Cg_shader, GL_EXT_abgr, 
    GL_EXT_bgra, GL_EXT_bindable_uniform, GL_EXT_blend_color, 
    GL_EXT_blend_equation_separate, GL_EXT_blend_func_separate, 
    GL_EXT_blend_minmax, GL_EXT_blend_subtract, GL_EXT_compiled_vertex_array, 
    GL_EXT_depth_bounds_test, GL_EXT_direct_state_access, 
    GL_EXT_draw_buffers2, GL_EXT_draw_instanced, GL_EXT_draw_range_elements, 
    GL_EXT_fog_coord, GL_EXT_framebuffer_blit, GL_EXT_framebuffer_multisample, 
    GL_EXT_framebuffer_multisample_blit_scaled, GL_EXT_framebuffer_object, 
    GL_EXT_framebuffer_sRGB, GL_EXT_geometry_shader4, 
    GL_EXT_gpu_program_parameters, GL_EXT_gpu_shader4, 
    GL_EXT_import_sync_object, GL_EXT_memory_object, GL_EXT_memory_object_fd, 
    GL_EXT_multi_draw_arrays, GL_EXT_packed_depth_stencil, 
    GL_EXT_packed_float, GL_EXT_packed_pixels, GL_EXT_pixel_buffer_object, 
    GL_EXT_point_parameters, GL_EXT_polygon_offset_clamp, 
    GL_EXT_provoking_vertex, GL_EXT_rescale_normal, GL_EXT_secondary_color, 
    GL_EXT_semaphore, GL_EXT_semaphore_fd, GL_EXT_separate_shader_objects, 
    GL_EXT_separate_specular_color, GL_EXT_shader_image_load_formatted, 
    GL_EXT_shader_image_load_store, GL_EXT_shader_integer_mix, 
    GL_EXT_shadow_funcs, GL_EXT_stencil_two_side, GL_EXT_stencil_wrap, 
    GL_EXT_texture3D, GL_EXT_texture_array, GL_EXT_texture_buffer_object, 
    GL_EXT_texture_compression_dxt1, GL_EXT_texture_compression_latc, 
    GL_EXT_texture_compression_rgtc, GL_EXT_texture_compression_s3tc, 
    GL_EXT_texture_cube_map, GL_EXT_texture_edge_clamp, 
    GL_EXT_texture_env_add, GL_EXT_texture_env_combine, 
    GL_EXT_texture_env_dot3, GL_EXT_texture_filter_anisotropic, 
    GL_EXT_texture_integer, GL_EXT_texture_lod, GL_EXT_texture_lod_bias, 
    GL_EXT_texture_mirror_clamp, GL_EXT_texture_object, GL_EXT_texture_sRGB, 
    GL_EXT_texture_sRGB_decode, GL_EXT_texture_shared_exponent, 
    GL_EXT_texture_storage, GL_EXT_texture_swizzle, GL_EXT_timer_query, 
    GL_EXT_transform_feedback2, GL_EXT_vertex_array, GL_EXT_vertex_array_bgra, 
    GL_EXT_vertex_attrib_64bit, GL_EXT_window_rectangles, 
    GL_EXT_x11_sync_object, GL_IBM_rasterpos_clip, 
    GL_IBM_texture_mirrored_repeat, GL_KHR_blend_equation_advanced, 
    GL_KHR_blend_equation_advanced_coherent, GL_KHR_context_flush_control, 
    GL_KHR_debug, GL_KHR_no_error, GL_KHR_robust_buffer_access_behavior, 
    GL_KHR_robustness, GL_KTX_buffer_region, GL_NVX_conditional_render, 
    GL_NVX_gpu_memory_info, GL_NVX_nvenc_interop, GL_NV_ES1_1_compatibility, 
    GL_NV_ES3_1_compatibility, GL_NV_alpha_to_coverage_dither_control, 
    GL_NV_bindless_multi_draw_indirect, 
    GL_NV_bindless_multi_draw_indirect_count, GL_NV_bindless_texture, 
    GL_NV_blend_equation_advanced, GL_NV_blend_equation_advanced_coherent, 
    GL_NV_blend_square, GL_NV_command_list, GL_NV_compute_program5, 
    GL_NV_conditional_render, GL_NV_copy_depth_to_color, GL_NV_copy_image, 
    GL_NV_deep_texture3D, GL_NV_depth_buffer_float, GL_NV_depth_clamp, 
    GL_NV_draw_texture, GL_NV_draw_vulkan_image, GL_NV_explicit_multisample, 
    GL_NV_fence, GL_NV_float_buffer, GL_NV_fog_distance, 
    GL_NV_fragment_program, GL_NV_fragment_program2, 
    GL_NV_fragment_program_option, GL_NV_framebuffer_multisample_coverage, 
    GL_NV_geometry_shader4, GL_NV_gpu_program4, GL_NV_gpu_program4_1, 
    GL_NV_gpu_program5, GL_NV_gpu_program5_mem_extended, 
    GL_NV_gpu_program_fp64, GL_NV_gpu_shader5, GL_NV_half_float, 
    GL_NV_internalformat_sample_query, GL_NV_light_max_exponent, 
    GL_NV_multisample_coverage, GL_NV_multisample_filter_hint, 
    GL_NV_occlusion_query, GL_NV_packed_depth_stencil, 
    GL_NV_parameter_buffer_object, GL_NV_parameter_buffer_object2, 
    GL_NV_path_rendering, GL_NV_pixel_data_range, GL_NV_point_sprite, 
    GL_NV_primitive_restart, GL_NV_register_combiners, 
    GL_NV_register_combiners2, GL_NV_robustness_video_memory_purge, 
    GL_NV_shader_atomic_counters, GL_NV_shader_atomic_float, 
    GL_NV_shader_atomic_int64, GL_NV_shader_buffer_load, 
    GL_NV_shader_storage_buffer_object, GL_NV_shader_thread_group, 
    GL_NV_shader_thread_shuffle, GL_NV_texgen_reflection, 
    GL_NV_texture_barrier, GL_NV_texture_compression_vtc, 
    GL_NV_texture_env_combine4, GL_NV_texture_multisample, 
    GL_NV_texture_rectangle, GL_NV_texture_shader, GL_NV_texture_shader2, 
    GL_NV_texture_shader3, GL_NV_transform_feedback, 
    GL_NV_transform_feedback2, GL_NV_uniform_buffer_unified_memory, 
    GL_NV_vdpau_interop, GL_NV_vertex_array_range, GL_NV_vertex_array_range2, 
    GL_NV_vertex_attrib_integer_64bit, GL_NV_vertex_buffer_unified_memory, 
    GL_NV_vertex_program, GL_NV_vertex_program1_1, GL_NV_vertex_program2, 
    GL_NV_vertex_program2_option, GL_NV_vertex_program3, GL_S3_s3tc, 
    GL_SGIS_generate_mipmap, GL_SGIS_texture_lod, GL_SGIX_depth_texture, 
    GL_SGIX_shadow, GL_SUN_slice_accum

OpenGL ES profile version string: OpenGL ES 3.2 NVIDIA 384.90
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.20
OpenGL ES profile extensions:
    GL_ANDROID_extension_pack_es31a, GL_EXT_base_instance, 
    GL_EXT_blend_func_extended, GL_EXT_blend_minmax, GL_EXT_buffer_storage, 
    GL_EXT_clip_cull_distance, GL_EXT_color_buffer_float, 
    GL_EXT_color_buffer_half_float, GL_EXT_compressed_ETC1_RGB8_sub_texture, 
    GL_EXT_copy_image, GL_EXT_debug_label, GL_EXT_discard_framebuffer, 
    GL_EXT_disjoint_timer_query, GL_EXT_draw_buffers_indexed, 
    GL_EXT_draw_elements_base_vertex, GL_EXT_draw_transform_feedback, 
    GL_EXT_float_blend, GL_EXT_frag_depth, GL_EXT_geometry_point_size, 
    GL_EXT_geometry_shader, GL_EXT_gpu_shader5, GL_EXT_map_buffer_range, 
    GL_EXT_memory_object, GL_EXT_memory_object_fd, GL_EXT_multi_draw_indirect, 
    GL_EXT_multisample_compatibility, GL_EXT_occlusion_query_boolean, 
    GL_EXT_polygon_offset_clamp, GL_EXT_primitive_bounding_box, 
    GL_EXT_protected_textures, GL_EXT_render_snorm, GL_EXT_robustness, 
    GL_EXT_sRGB, GL_EXT_sRGB_write_control, GL_EXT_semaphore, 
    GL_EXT_semaphore_fd, GL_EXT_separate_shader_objects, 
    GL_EXT_shader_group_vote, GL_EXT_shader_implicit_conversions, 
    GL_EXT_shader_integer_mix, GL_EXT_shader_io_blocks, 
    GL_EXT_shader_non_constant_global_initializers, GL_EXT_shader_texture_lod, 
    GL_EXT_shadow_samplers, GL_EXT_sparse_texture, 
    GL_EXT_tessellation_point_size, GL_EXT_tessellation_shader, 
    GL_EXT_texture_border_clamp, GL_EXT_texture_buffer, 
    GL_EXT_texture_compression_dxt1, GL_EXT_texture_compression_s3tc, 
    GL_EXT_texture_cube_map_array, GL_EXT_texture_filter_anisotropic, 
    GL_EXT_texture_format_BGRA8888, GL_EXT_texture_norm16, GL_EXT_texture_rg, 
    GL_EXT_texture_sRGB_R8, GL_EXT_texture_sRGB_decode, 
    GL_EXT_texture_storage, GL_EXT_texture_view, GL_EXT_unpack_subimage, 
    GL_EXT_window_rectangles, GL_KHR_blend_equation_advanced, 
    GL_KHR_blend_equation_advanced_coherent, GL_KHR_context_flush_control, 
    GL_KHR_debug, GL_KHR_no_error, GL_KHR_robust_buffer_access_behavior, 
    GL_KHR_robustness, GL_NV_bgr, GL_NV_bindless_texture, 
    GL_NV_blend_equation_advanced, GL_NV_blend_equation_advanced_coherent, 
    GL_NV_conditional_render, GL_NV_copy_buffer, GL_NV_copy_image, 
    GL_NV_draw_buffers, GL_NV_draw_instanced, GL_NV_draw_texture, 
    GL_NV_draw_vulkan_image, GL_NV_explicit_attrib_location, 
    GL_NV_fbo_color_attachments, GL_NV_framebuffer_blit, 
    GL_NV_framebuffer_multisample, GL_NV_generate_mipmap_sRGB, 
    GL_NV_gpu_shader5, GL_NV_image_formats, GL_NV_instanced_arrays, 
    GL_NV_internalformat_sample_query, GL_NV_non_square_matrices, 
    GL_NV_occlusion_query_samples, GL_NV_pack_subimage, GL_NV_packed_float, 
    GL_NV_packed_float_linear, GL_NV_path_rendering, 
    GL_NV_pixel_buffer_object, GL_NV_polygon_mode, GL_NV_read_buffer, 
    GL_NV_read_depth, GL_NV_read_depth_stencil, GL_NV_read_stencil, 
    GL_NV_sRGB_formats, GL_NV_shader_noperspective_interpolation, 
    GL_NV_shadow_samplers_array, GL_NV_shadow_samplers_cube, 
    GL_NV_texture_array, GL_NV_texture_barrier, GL_NV_texture_border_clamp, 
    GL_NV_texture_compression_latc, GL_NV_texture_compression_s3tc, 
    GL_NV_texture_compression_s3tc_update, GL_NV_timer_query, 
    GL_NV_viewport_array, GL_OES_compressed_ETC1_RGB8_texture, 
    GL_OES_copy_image, GL_OES_depth24, GL_OES_depth32, GL_OES_depth_texture, 
    GL_OES_depth_texture_cube_map, GL_OES_draw_buffers_indexed, 
    GL_OES_draw_elements_base_vertex, GL_OES_element_index_uint, 
    GL_OES_fbo_render_mipmap, GL_OES_geometry_point_size, 
    GL_OES_geometry_shader, GL_OES_get_program_binary, GL_OES_gpu_shader5, 
    GL_OES_mapbuffer, GL_OES_packed_depth_stencil, 
    GL_OES_primitive_bounding_box, GL_OES_rgb8_rgba8, GL_OES_sample_shading, 
    GL_OES_sample_variables, GL_OES_shader_image_atomic, 
    GL_OES_shader_io_blocks, GL_OES_shader_multisample_interpolation, 
    GL_OES_standard_derivatives, GL_OES_tessellation_point_size, 
    GL_OES_tessellation_shader, GL_OES_texture_border_clamp, 
    GL_OES_texture_buffer, GL_OES_texture_cube_map_array, 
    GL_OES_texture_float, GL_OES_texture_float_linear, 
    GL_OES_texture_half_float, GL_OES_texture_half_float_linear, 
    GL_OES_texture_npot, GL_OES_texture_stencil8, 
    GL_OES_texture_storage_multisample_2d_array, GL_OES_texture_view, 
    GL_OES_vertex_array_object, GL_OES_vertex_half_float, 
    GL_OES_viewport_array

有线索吗?我做错了什么吗?

编辑:

来自 es2_info:

EGL_VERSION: 1.4
EGL_VENDOR: NVIDIA
EGL_CLIENT_APIS: OpenGL_ES OpenGL
GL_VERSION: OpenGL ES 3.2 NVIDIA 384.90
GL_RENDERER: Quadro M2000M/PCIe/SSE2

我删除了扩展程序。计算器的限制

#define GLEW_EGL 在 gcc 命令行上,以便 glew.c 使用 eglGetProcAddress() 而不是 glXGetProcAddressARB():

g++ -DGLEW_EGL -DGLEW_STATIC -Iglew-2.1.0/include main.cpp glew-2.1.0/src/glew.c -lGL -lEGL
    ^^^^^^^^^^ this is where the magic happens

使用最新的 GLEW 2.1.0 tarball 构建此代码:

#include <GL/glew.h>
#include <EGL/egl.h>
#include <iostream>

int main(int argc, char **argv)
{
    EGLDisplay display = eglGetDisplay( EGL_DEFAULT_DISPLAY ) ;
    if( display == EGL_NO_DISPLAY )
    {
        std:: cout << "ERROR: EGL could not be initialized"<< std::endl;
        exit(EXIT_FAILURE);
    }

    if( eglInitialize( display, nullptr, nullptr ) != EGL_TRUE )
    {
        std:: cout << "ERROR: Could not start EGL display connection"<< std::endl;
        exit(EXIT_FAILURE);
    }

    EGLConfig config;
    EGLint num_config = 0;
    if( eglChooseConfig( display, nullptr, &config, 1, &num_config ) != EGL_TRUE )
    {
        std:: cout << "ERROR: Configuration selection failed" << std::endl;
        exit(EXIT_FAILURE);
    }
    if( num_config == 0 )
    {
        std:: cout << "ERROR: No configurations" << std::endl;
        exit(EXIT_FAILURE);
    }

    eglBindAPI( EGL_OPENGL_API );
    EGLContext context = eglCreateContext( display, config, EGL_NO_CONTEXT, NULL );
    if( eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, context) != EGL_TRUE )
    {
        std:: cout << "ERROR: Display was not made current one"<< std::endl;
        exit(EXIT_FAILURE);
    }

    GLenum err = glewInit();
    if (GLEW_OK != err)
    {
        std:: cout << "GLEW Error: " << glewGetErrorString(err) << std::endl;
        exit(EXIT_FAILURE);
    }

    std::cout << glGetString( GL_VERSION ) << std::endl;
    std::cout << glGetString( GL_VENDOR ) << std::endl;
    std::cout << glGetString( GL_RENDERER ) << std::endl;

    return 0;
}

...在我的 X11 中的 Debian Stretch 系统上给了我这个:

3.0 Mesa 13.0.6
Intel Open Source Technology Center
Mesa DRI Intel(R) Kabylake GT2 

2017 年 11 月 28 日原始答案:

我认为这是 nvidia 软件包的最新版本中的错误:

https://bugs.launchpad.net/ubuntu/+source/nvidia-graphics-drivers-384/+bug/1731968

Release: Ubuntu 16.04.3 LTS

Package version: 384.90-0ubuntu0.16.04.2

In the latest driver 384.90-0ubuntu0.16.04.2, EGL initialisation is now broken and the GL context returned is inconsistent leading to crashes. I have prepared a minimised testcase that showcases the problem with the latest driver. I have also made sure it works fine with both previous versions 384.90-0ubuntu0.16.04.1 and 384.81-0ubuntu1 in a clean install.

我的 EGL 程序在我的生产服务器上运行良好,我有这些 nvidia 包:

$ dpkg -l | grep nvidia
ii  nvidia-367                            375.66-0ubuntu0.16.04.1                    amd64        Transitional package for nvidia-375
ii  nvidia-375                            384.90-0ubuntu0.16.04.1                    amd64        Transitional package for nvidia-384
ii  nvidia-384                            384.90-0ubuntu0.16.04.1                    amd64        NVIDIA binary driver - version 384.90
rc  nvidia-opencl-icd-375                 384.90-0ubuntu0.16.04.1                    amd64        Transitional package for nvidia-opencl-icd-384
ii  nvidia-opencl-icd-384                 384.90-0ubuntu0.16.04.1                    amd64        NVIDIA OpenCL ICD
ii  nvidia-prime                          0.8.2                                      amd64        Tools to enable NVIDIA's Prime
ii  nvidia-settings                       361.42-0ubuntu1                            amd64        Tool for configuring the NVIDIA graphics driver

但是在安装更新(apt-get update 后跟 apt-get upgrade)后,它在我的测试服务器上开始失败,然后我在其中安装了这些 nvidia 软件包:

$ dpkg -l | grep nvidia
ii  nvidia-367                            375.66-0ubuntu0.16.04.1                    amd64        Transitional package for nvidia-375
ii  nvidia-375                            384.90-0ubuntu0.16.04.2                    amd64        Transitional package for nvidia-384
ii  nvidia-384                            384.90-0ubuntu0.16.04.2                    amd64        NVIDIA binary driver - version 384.90
ii  nvidia-opencl-icd-384                 384.90-0ubuntu0.16.04.2                    amd64        NVIDIA OpenCL ICD
ii  nvidia-prime                          0.8.2                                      amd64        Tools to enable NVIDIA's Prime
ii  nvidia-settings                       361.42-0ubuntu1                            amd64        Tool for configuring the NVIDIA graphics driver

我将 nvidia-384 软件包降级到旧版本:

$ sudo apt-get install nvidia-384=384.90-0ubuntu0.16.04.1

然后重启。之后我现在有了这个:

$ dpkg -l | grep nvidia
ii  nvidia-367                            375.66-0ubuntu0.16.04.1                    amd64        Transitional package for nvidia-375
ii  nvidia-375                            384.90-0ubuntu0.16.04.2                    amd64        Transitional package for nvidia-384
ii  nvidia-384                            384.90-0ubuntu0.16.04.1                    amd64        NVIDIA binary driver - version 384.90
ii  nvidia-opencl-icd-384                 384.90-0ubuntu0.16.04.2                    amd64        NVIDIA OpenCL ICD
ii  nvidia-prime                          0.8.2                                      amd64        Tools to enable NVIDIA's Prime
ii  nvidia-settings                       361.42-0ubuntu1                            amd64        Tool for configuring the NVIDIA graphics driver

现在我的 EGL 程序又可以工作了!

2018 年 1 月 15 日更新:

几天前 Ubuntu 发布了 384.111 更新,其中包含对 Spectre 个漏洞之一的修复:

https://bugs.launchpad.net/ubuntu/+source/nvidia-graphics-drivers-384/+bug/1741807

According to http://nvidia.custhelp.com/app/answers/detail/a_id/4611 the NVIDIA driver needs to be updated to 384.111 to fix the Spectre vulnerabilities in the NVIDIA kernel modules (along with the upcoming Kernel security patches).

此更新是自动应用的,并再次破坏了我服务器上的 EGL,安装了以下软件包:

$ dpkg -l | grep nvidia
ii  nvidia-367                            375.66-0ubuntu0.16.04.1                    amd64        Transitional package for nvidia-375
ii  nvidia-375                            384.111-0ubuntu0.16.04.1                   amd64        Transitional package for nvidia-384
ii  nvidia-384                            384.111-0ubuntu0.16.04.1                   amd64        NVIDIA binary driver - version 384.111
rc  nvidia-opencl-icd-375                 384.90-0ubuntu0.16.04.1                    amd64        Transitional package for nvidia-opencl-icd-384
ii  nvidia-opencl-icd-384                 384.111-0ubuntu0.16.04.1                   amd64        NVIDIA OpenCL ICD
ii  nvidia-prime                          0.8.2                                      amd64        Tools to enable NVIDIA's Prime
ii  nvidia-settings                       361.42-0ubuntu1                            amd64        Tool for configuring the NVIDIA graphics driver

之前的降级到 384.90-0ubuntu0.16.04.1 的修复不再有效:

$ sudo apt-get install nvidia-384=384.90-0ubuntu0.16.04.1
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Version '384.90-0ubuntu0.16.04.1' for 'nvidia-384' was not found

这是因为它已于 2018 年 1 月 10 日被取代和删除:

https://launchpad.net/ubuntu/+source/nvidia-graphics-drivers-384/+publishinghistory

我可以通过删除所有 NVIDIA 软件包来解决这个问题:

$ sudo apt-get purge nvidia*

然后手动安装384.90驱动:

$ wget https://launchpad.net/ubuntu/+archive/primary/+files/nvidia-graphics-drivers-384_384.90.orig.tar.gz
$ tar xzf nvidia-graphics-drivers-384_384.90.orig.tar.gz
$ cd nvidia-graphics-drivers-384_384.90
$ chmod u+x NVIDIA-Linux-x86_64-384.90-no-compat32.run
$ sudo ./NVIDIA-Linux-x86_64-384.90-no-compat32.run

我的 EGL 程序现在又可以工作了。但是请注意,它现在 运行 是一个未打补丁的驱动程序 ,因此这可能不适合您,因为它可能会使您的系统出现漏洞。

2018 年 1 月 15 日更新(第 2 部分):

只是为了一些额外的背景/参考,我也从这里尝试了 390.12 的测试版,它于 1 月 13 日发布:

https://launchpad.net/~graphics-drivers/+archive/ubuntu/ppa

我做了以下事情:

$ sudo apt-get purge nvidia*
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt-get update
$ sudo apt-get install nvidia-390

这导致以下已安装软件包列表:

$ dpkg -l | grep nvidia
ii  nvidia-390                            390.12-0ubuntu0~gpu16.04.2                 amd64        NVIDIA binary driver - version 390.12
ii  nvidia-opencl-icd-390                 390.12-0ubuntu0~gpu16.04.2                 amd64        NVIDIA OpenCL ICD
ii  nvidia-prime                          0.8.2                                      amd64        Tools to enable NVIDIA's Prime
ii  nvidia-settings                       390.12-0ubuntu0~gpu16.04.1                 amd64        Tool for configuring the NVIDIA graphics driver

但是 EGL 仍然不起作用。

2018 年 3 月 16 日更新:

390.25 的测试版于 1 月 30 日发布。为了尝试,我再次执行了以下操作:

$ sudo apt-get purge nvidia*
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt-get update
$ sudo apt-get install nvidia-390

这导致以下已安装软件包列表:

$ dpkg -l | grep nvidia
ii  nvidia-390                            390.25-0ubuntu0~gpu16.04.1                 amd64        NVIDIA binary driver - version 390.25
ii  nvidia-opencl-icd-390                 390.25-0ubuntu0~gpu16.04.1                 amd64        NVIDIA OpenCL ICD
ii  nvidia-prime                          0.8.2                                      amd64        Tools to enable NVIDIA's Prime
ii  nvidia-settings                       390.25-0ubuntu0~gpu16.04.1                 amd64        Tool for configuring the NVIDIA graphics driver

但是 EGL 仍然不起作用。

2018 年 5 月 17 日更新:

我正在设置一个新服务器,所以又试了一次。

https://launchpad.net/~graphics-drivers/+archive/ubuntu/ppa 开始,'long-lived branch release' 现在是 390.48(4 月 18 日发布),'short-lived branch release' 现在是 396.24(5 月 3 日发布)。

我试过390.48:

$ sudo apt-get purge nvidia*
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt-get update
$ sudo apt-get install nvidia-390

这导致了以下已安装软件包列表:

$ dpkg -l | grep nvidia
ii  nvidia-390                            390.48-0ubuntu0~gpu16.04.3                 amd64        NVIDIA binary driver - version 390.48
ii  nvidia-opencl-icd-390                 390.48-0ubuntu0~gpu16.04.3                 amd64        NVIDIA OpenCL ICD
ii  nvidia-prime                          0.8.2                                      amd64        Tools to enable NVIDIA's Prime
ii  nvidia-settings                       396.24-0ubuntu0~gpu16.04.1                 amd64        Tool for configuring the NVIDIA graphics driver

但是 EGL 仍然不起作用。

我试过396.24:

$ sudo apt-get purge nvidia*
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt-get update
$ sudo apt-get install nvidia-396

这导致了以下已安装软件包列表:

$ dpkg -l | grep nvidia
ii  nvidia-396                            396.24-0ubuntu0~gpu16.04.1                 amd64        NVIDIA binary driver - version 396.24
ii  nvidia-opencl-icd-396                 396.24-0ubuntu0~gpu16.04.1                 amd64        NVIDIA OpenCL ICD
ii  nvidia-prime                          0.8.2                                      amd64        Tools to enable NVIDIA's Prime
ii  nvidia-settings                       396.24-0ubuntu0~gpu16.04.1                 amd64        Tool for configuring the NVIDIA graphics driver

但是 EGL 仍然不起作用。

手动安装 384.90 驱动程序仍然有效。

我之前一直在 AWS g2.2xlarge 服务器上安装。这次我是在Azure NC6服务器上安装,必须禁用统一内存否则安装会失败,即:

$ sudo apt-get purge nvidia*
$ wget https://launchpad.net/ubuntu/+archive/primary/+files/nvidia-graphics-drivers-384_384.90.orig.tar.gz
$ tar xzf nvidia-graphics-drivers-384_384.90.orig.tar.gz
$ cd nvidia-graphics-drivers-384_384.90
$ chmod u+x NVIDIA-Linux-x86_64-384.90-no-compat32.run
$ sudo ./NVIDIA-Linux-x86_64-384.90-no-compat32.run --no-unified-memory

请注意,如果没有统一内存,CUDA 将不可用。

另请注意,如上所述,这仍然是 Spectre 漏洞补丁之前的未打补丁的驱动程序

2018 年 6 月 25 日更新:

https://launchpad.net/~graphics-drivers/+archive/ubuntu/ppa 开始,最新版本现在是 390.67(6 月 7 日发布)和 396.24.02(6 月 4 日发布)。

我试过390.67:

$ sudo apt-get purge nvidia*
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt-get update
$ sudo apt-get install nvidia-390
$ sudo reboot
[after reboot]
$ dpkg -l | grep nvidia
ii  nvidia-390                            390.67-0ubuntu0~gpu16.04.1                 amd64        NVIDIA binary driver - version 390.67
ii  nvidia-opencl-icd-390                 390.67-0ubuntu0~gpu16.04.1                 amd64        NVIDIA OpenCL ICD
ii  nvidia-prime                          0.8.2                                      amd64        Tools to enable NVIDIA's Prime
ii  nvidia-settings                       396.24-0ubuntu0~gpu16.04.1                 amd64        Tool for configuring the NVIDIA graphics driver

EGL 仍然没有工作。

我试过 396.24.02:

$ sudo apt-get purge nvidia*
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt-get update
$ sudo apt-get install nvidia-396
$ sudo reboot
[after reboot]
$ dpkg -l | grep nvidia
ii  nvidia-396                            396.24.02-0ubuntu0~gpu16.04.1              amd64        NVIDIA binary driver - version 396.24.02
ii  nvidia-opencl-icd-396                 396.24.02-0ubuntu0~gpu16.04.1              amd64        NVIDIA OpenCL ICD
ii  nvidia-prime                          0.8.2                                      amd64        Tools to enable NVIDIA's Prime
ii  nvidia-settings                       396.24-0ubuntu0~gpu16.04.1                 amd64        Tool for configuring the NVIDIA graphics driver

EGL 仍然没有工作。

我也尝试了 384.130(2018 年 3 月 29 日发布),即 "old long-lived branch release":

$ sudo apt-get purge nvidia*
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt-get update
$ sudo apt-get install nvidia-384
$ sudo reboot
[after reboot]
$ dpkg -l | grep nvidia
ii  nvidia-384                            384.130-0ubuntu0.16.04.1                   amd64        NVIDIA binary driver - version 384.130
ii  nvidia-opencl-icd-384                 384.130-0ubuntu0.16.04.1                   amd64        NVIDIA OpenCL ICD
ii  nvidia-prime                          0.8.2                                      amd64        Tools to enable NVIDIA's Prime
ii  nvidia-settings                       396.24-0ubuntu0~gpu16.04.1                 amd64        Tool for configuring the NVIDIA graphics driver

EGL 仍然没有工作。

我今天再次尝试这些的原因是 EGL 在我的服务器重新启动后停止工作。

手动安装旧的 384.90 驱动程序(如早期更新中所述,它曾为我工作过)将失败,并在 /var/log/nvidia-installer.log:

中出现以下错误
/tmp/selfgz3957/NVIDIA-Linux-x86_64-384.90-no-compat32/kernel/nvidia/nv.c: In function ‘nv_start_rc_timer’:
/tmp/selfgz3957/NVIDIA-Linux-x86_64-384.90-no-compat32/kernel/nvidia/nv.c:3206:5: error: implicit declaration of function ‘init_timer’ [-Werror=implicit-function-declaration]
     init_timer(&nvl->rc_timer);
     ^
/tmp/selfgz3957/NVIDIA-Linux-x86_64-384.90-no-compat32/kernel/nvidia/nv.c:3207:28: error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types]
     nvl->rc_timer.function = nvidia_rc_timer;
                            ^
/tmp/selfgz3957/NVIDIA-Linux-x86_64-384.90-no-compat32/kernel/nvidia/nv.c:3208:18: error: ‘struct timer_list’ has no member named ‘data’
     nvl->rc_timer.data = (unsigned long) nvl;

此错误是因为 Linux 计时器 API 在内核 4.15 中被更改:

https://lwn.net/Articles/735887/

https://github.com/torvalds/linux/commit/513ae785c63c30741e46f43960213d4ae5382ec0#diff-ba8897e9349509c7ca4d37b0704bee9c

我的服务器最近升级到内核 4.15:

$ uname -r
4.15.0-1013-azure

$ grep install /var/log/dpkg.log | grep linux-image
2018-06-18 04:13:09 install linux-image-4.15.0-1013-azure:amd64 <none> 4.15.0-1013.13~16.04.2
2018-06-18 04:13:09 status half-installed linux-image-4.15.0-1013-azure:amd64 4.15.0-1013.13~16.04.2
2018-06-18 04:13:10 status half-installed linux-image-azure:amd64 4.13.0.1018.19
2018-06-18 04:13:10 status half-installed linux-image-azure:amd64 4.13.0.1018.19
2018-06-18 04:13:58 status installed linux-image-4.15.0-1013-azure:amd64 4.15.0-1013.13~16.04.2
2018-06-18 04:13:59 status installed linux-image-azure:amd64 4.15.0.1013.20
2018-06-18 04:14:13 status installed linux-image-4.15.0-1013-azure:amd64 4.15.0-1013.13~16.04.2

为了允许旧驱动程序工作,我通过使用 these instructions 更改 grub 配置恢复到内核 4.13。首先我检查了哪些 grub 菜单项可用:

$ grep menuentry /boot/grub/grub.cfg
if [ x"${feature_menuentry_id}" = xy ]; then
  menuentry_id_option="--id"
  menuentry_id_option=""
export menuentry_id_option
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-dfb884db-c6ad-4c7a-8075-98cf640a2892' {
submenu 'Advanced options for Ubuntu' $menuentry_id_option 'gnulinux-advanced-dfb884db-c6ad-4c7a-8075-98cf640a2892' {
    menuentry 'Ubuntu, with Linux 4.15.0-1013-azure' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.15.0-1013-azure-advanced-dfb884db-c6ad-4c7a-8075-98cf640a2892' {
    menuentry 'Ubuntu, with Linux 4.15.0-1013-azure (upstart)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.15.0-1013-azure-init-upstart-dfb884db-c6ad-4c7a-8075-98cf640a2892' {
    menuentry 'Ubuntu, with Linux 4.15.0-1013-azure (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.15.0-1013-azure-recovery-dfb884db-c6ad-4c7a-8075-98cf640a2892' {
    menuentry 'Ubuntu, with Linux 4.13.0-1018-azure' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.13.0-1018-azure-advanced-dfb884db-c6ad-4c7a-8075-98cf640a2892' {
    menuentry 'Ubuntu, with Linux 4.13.0-1018-azure (upstart)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.13.0-1018-azure-init-upstart-dfb884db-c6ad-4c7a-8075-98cf640a2892' {
    menuentry 'Ubuntu, with Linux 4.13.0-1018-azure (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.13.0-1018-azure-recovery-dfb884db-c6ad-4c7a-8075-98cf640a2892' {
    menuentry 'Ubuntu, with Linux 4.13.0-1016-azure' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.13.0-1016-azure-advanced-dfb884db-c6ad-4c7a-8075-98cf640a2892' {
    menuentry 'Ubuntu, with Linux 4.13.0-1016-azure (upstart)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.13.0-1016-azure-init-upstart-dfb884db-c6ad-4c7a-8075-98cf640a2892' {
    menuentry 'Ubuntu, with Linux 4.13.0-1016-azure (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.13.0-1016-azure-recovery-dfb884db-c6ad-4c7a-8075-98cf640a2892' {

我想要的内核是 Advanced options for Ubuntu 子菜单下的 Ubuntu, with Linux 4.13.0-1018-azure

所以我编辑了 /etc/default/grub 以将 GRUB_DEFAULT 行更改为:

GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 4.13.0-1018-azure"

然后:

$ sudo update-grub

然后重启,检查内核:

$ uname -r
4.13.0-1018-azure

然后我能够让 EGL 再次与旧的 384.90 驱动程序一起工作。

2019 年 1 月 8 日更新:

https://launchpad.net/~graphics-drivers/+archive/ubuntu/ppa 开始,最新版本现在是 410.78(长期分支,2018 年 11 月 26 日发布)和 415.25(2018 年 12 月 20 日发布)。

我试过410.78:

$ sudo apt-get purge nvidia*
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt-get update
$ sudo apt-get install nvidia-410
$ sudo reboot
[after reboot]
$ dpkg -l | grep nvidia
ii  nvidia-410                            410.78-0ubuntu0~gpu16.04.1                 amd64        NVIDIA binary driver - version 410.78
ii  nvidia-opencl-icd-410                 410.78-0ubuntu0~gpu16.04.1                 amd64        NVIDIA OpenCL ICD
ii  nvidia-prime                          0.8.2                                      amd64        Tools to enable NVIDIA's Prime
ii  nvidia-settings                       415.25-0ubuntu0~gpu16.04.1                 amd64        Tool for configuring the NVIDIA graphics driver

EGL 仍然没有工作。

我试过415.25:

$ sudo apt-get purge nvidia*
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt-get update
$ sudo apt-get install nvidia-415
$ sudo reboot
[after reboot]
$ dpkg -l | grep nvidia
ii  nvidia-415                            415.25-0ubuntu0~gpu16.04.1                 amd64        NVIDIA binary driver - version 415.25
ii  nvidia-opencl-icd-415                 415.25-0ubuntu0~gpu16.04.1                 amd64        NVIDIA OpenCL ICD
ii  nvidia-prime                          0.8.2                                      amd64        Tools to enable NVIDIA's Prime
ii  nvidia-settings                       415.25-0ubuntu0~gpu16.04.1                 amd64        Tool for configuring the NVIDIA graphics driver

EGL 仍然没有工作。

对于不同的方法,我还尝试根据 https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html:

中描述的步骤通过 cuda 驱动程序包安装驱动程序
$ sudo apt-get purge nvidia*
$ wget https://developer.nvidia.com/compute/cuda/10.0/Prod/local_installers/cuda-repo-ubuntu1604-10-0-local-10.0.130-410.48_1.0-1_amd64
$ mv cuda-repo-ubuntu1604-10-0-local-10.0.130-410.48_1.0-1_amd64 cuda-repo-ubuntu1604-10-0-local-10.0.130-410.48_1.0-1_amd64.deb
$ sudo dpkg -i cuda-repo-ubuntu1604-10-0-local-10.0.130-410.48_1.0-1_amd64.deb
$ sudo apt-key add /var/cuda-repo-10-0-local-10.0.130-410.48/7fa2af80.pub
$ sudo apt-get update
$ sudo apt-get install cuda
$ sudo reboot
[after reboot]
$ cat /proc/driver/nvidia/version
NVRM version: NVIDIA UNIX x86_64 Kernel Module  410.78  Sat Nov 10 22:09:04 CST 2018
GCC version:  gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.10) 
$ dpkg -l | grep nvidia
ii  nvidia-410                                      410.78-0ubuntu0~gpu16.04.1                 amd64        NVIDIA binary driver - version 410.78
ii  nvidia-410-dev                                  410.78-0ubuntu0~gpu16.04.1                 amd64        NVIDIA binary Xorg driver development files
ii  nvidia-modprobe                                 410.48-0ubuntu1                            amd64        Load the NVIDIA kernel driver and create device files
ii  nvidia-opencl-icd-410                           410.78-0ubuntu0~gpu16.04.1                 amd64        NVIDIA OpenCL ICD
ii  nvidia-prime                                    0.8.2                                      amd64        Tools to enable NVIDIA's Prime
ii  nvidia-settings                                 415.25-0ubuntu0~gpu16.04.1                 amd64        Tool for configuring the NVIDIA graphics driver

EGL 仍然没有工作。

我执行了以下操作来删除 cuda 安装:

$ sudo apt-get purge nvidia*
$ sudo apt-get purge cuda*

手动安装旧的 384.90 驱动程序仍然有效。

2018 年 8 月在 the original bug report 上发表的评论说:

Matthew Matl (mmatl) wrote on 2018-08-27:

This works when installing using the runfile method, but fails for the packaged drivers. So it definitely appears to be a packaging issue specific to Ubuntu. Confirmed to work on Fedora and Arch with 390-series drivers as well.

为了测试这一点,我尝试手动安装最新的驱动程序 https://www.nvidia.com/object/unix.html(目前长寿支线410.93):

$ wget -L http://us.download.nvidia.com/XFree86/Linux-x86_64/410.93/NVIDIA-Linux-x86_64-410.93.run
$ sudo sh NVIDIA-Linux-x86_64-410.93.run
$ sudo reboot
[after reboot]
$ cat /proc/driver/nvidia/version
NVRM version: NVIDIA UNIX x86_64 Kernel Module  410.93  Thu Dec 20 17:01:16 CST 2018
GCC version:  gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.10)

运行 原始错误报告中的测试用例现在可以工作了!

$ wget https://gist.githubusercontent.com/funchal/bff0a8d6dae5b3ace1a88c392416b5bc/raw/1427821a2390a30779881ab59c55b5550a468919/main.c
$ gcc main.c -lGL -lEGL
$ ./a.out
egl 1.5
renderer: Tesla K80/PCIe/SSE2
version: 4.6.0 NVIDIA 410.93

它甚至在我恢复之前不得不禁用的 4.15 内核时起作用。

卸载此手动安装的驱动程序需要执行以下操作:

$ sudo nvidia-uninstall

为了比较,我还尝试使用运行文件而不是包方法手动安装最新的 CUDA 驱动程序(其中包括版本 410.48 的 nvidia 驱动程序):

$ wget -L https://developer.nvidia.com/compute/cuda/10.0/Prod/local_installers/cuda_10.0.130_410.48_linux
$ mv cuda_10.0.130_410.48_linux cuda_10.0.130_410.48_linux.run
$ sudo sh cuda_10.0.130_410.48_linux.run

Do you accept the previously read EULA?
accept/decline/quit: accept

Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 410.48?
(y)es/(n)o/(q)uit: y

Do you want to install the OpenGL libraries?
(y)es/(n)o/(q)uit [ default is yes ]: y

Do you want to run nvidia-xconfig?
This will update the system X configuration file so that the NVIDIA X driver
is used. The pre-existing X configuration file will be backed up.
This option should not be used on systems that require a custom
X configuration, such as systems with multiple GPU vendors.
(y)es/(n)o/(q)uit [ default is no ]: n

Install the CUDA 10.0 Toolkit?
(y)es/(n)o/(q)uit: n

Install the CUDA 10.0 Samples?
(y)es/(n)o/(q)uit: n

$ sudo reboot
[after reboot]
$ cat /proc/driver/nvidia/version
NVRM version: NVIDIA UNIX x86_64 Kernel Module  410.48  Thu Sep  6 06:36:33 CDT 2018
GCC version:  gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.10)

这也有效。

2019 年 2 月 13 日更新:

我达到了这个答案 30,000 个字符的限制,不得不继续

2019 年 2 月 13 日更新:

我在 中达到了 30,000 个字符的限制,因此不得不 post 这是一个单独的答案。

我在 Linking OpenGL for Server-Side Rendering 上看到这个 nvidia 博客 post。

这包括以下内容(强调我的):

When the classic OpenGL Application Binary Interface (ABI) was introduced 17 years ago, the only widely adopted windowing and display management system on linux was X11. OpenGL context management, which is not part of OpenGL itself, was therefore synonymous with the glX API. And because the only way to use OpenGL on Linux was via glX, functions for both OpenGL and glX were bundled into the same library, libGL.so.

Linking an OpenGL application was simple: you only needed to link against libGL.so.

Over the years, the situation has changed and a wide range of display managers have emerged. People want to have X11-based display managers on the same system with Wayland, or to use hardware-accelerated OpenGL on the same system with software-emulated OpenGL. This requires a cleaner separation between the OpenGL library and OpenGL context-management libraries.

GLVND, the OpenGL Vendor Neutral Dispatch for Linux, was born to meet this requirement.

To use glX and OpenGL today, you should link against libOpenGL.so as well as libGLX.so. The first contains the OpenGL symbols, the latter the GLX symbols. If you want to use EGL context management instead, link against libOpenGL.so and libEGL.so.

所以,这表明要使用 EGL,我应该链接到 libOpenGL.so 而不是 libGL.so。

为了对此进行测试,我首先使用包管理器安装了驱动程序:

$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt-get update
$ sudo apt-get install nvidia-410
$ sudo reboot
[after reboot]
$ dpkg -l | grep nvidia
ii  nvidia-410                            410.78-0ubuntu0~gpu16.04.1                 amd64        NVIDIA binary driver - version 410.78
ii  nvidia-opencl-icd-410                 410.78-0ubuntu0~gpu16.04.1                 amd64        NVIDIA OpenCL ICD
ii  nvidia-prime                          0.8.2                                      amd64        Tools to enable NVIDIA's Prime
ii  nvidia-settings                       415.27-0ubuntu0~gpu16.04.1                 amd64        Tool for configuring the NVIDIA graphics driver
$ cat /proc/driver/nvidia/version
NVRM version: NVIDIA UNIX x86_64 Kernel Module  410.78  Sat Nov 10 22:09:04 CST 2018
GCC version:  gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.11)

如前所述,当将测试应用程序链接到 libGL.so:

时,EGL 无法使用打包的驱动程序
$ wget https://gist.githubusercontent.com/funchal/bff0a8d6dae5b3ace1a88c392416b5bc/raw/1427821a2390a30779881ab59c55b5550a468919/main.c
$ gcc main.c -lGL -lEGL
$ ./a.out
egl 1.5
a.out: main.c:53: main: Assertion `renderer' failed.
Aborted (core dumped)

机器同时包含libGL.so和libOpenGL.so:

$ sudo find /usr -name libGL.so
/usr/lib32/nvidia-410/libGL.so
/usr/lib/nvidia-410/libGL.so
/usr/lib/x86_64-linux-gnu/mesa/libGL.so
/usr/lib/x86_64-linux-gnu/libGL.so
$ sudo find /usr -name libOpenGL.so
/usr/lib32/nvidia-410/libOpenGL.so
/usr/lib/nvidia-410/libOpenGL.so
$ sudo find /usr -name libEGL.so
/usr/lib32/nvidia-410/libEGL.so
/usr/lib/nvidia-410/libEGL.so
/usr/lib/x86_64-linux-gnu/mesa-egl/libEGL.so
/usr/lib/x86_64-linux-gnu/libEGL.so

Link针对 libOpenGL.so 测试应用程序有效!

$ wget https://gist.githubusercontent.com/funchal/bff0a8d6dae5b3ace1a88c392416b5bc/raw/1427821a2390a30779881ab59c55b5550a468919/main.c
$ gcc main.c -L/usr/lib/nvidia-410 -lOpenGL -lEGL
$ ./a.out
egl 1.5
renderer: Tesla K80/PCIe/SSE2
version: 4.6.0 NVIDIA 410.78

然后我测试了通过 运行 文件安装驱动程序:

$ wget -L http://us.download.nvidia.com/XFree86/Linux-x86_64/410.93/NVIDIA-Linux-x86_64-410.93.run
$ sudo sh NVIDIA-Linux-x86_64-410.93.run
$ sudo reboot
[after reboot]
$ cat /proc/driver/nvidia/version
NVRM version: NVIDIA UNIX x86_64 Kernel Module  410.93  Thu Dec 20 17:01:16 CST 2018
GCC version:  gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.10)

这些是可用的库:

$ sudo find /usr -name libGL.so
/usr/lib32/libGL.so
/usr/lib/x86_64-linux-gnu/libGL.so
$ sudo find /usr -name libOpenGL.so
/usr/lib32/libOpenGL.so
/usr/lib/x86_64-linux-gnu/libOpenGL.so
$ sudo find /usr -name libEGL.so
/usr/lib32/libEGL.so
/usr/lib/x86_64-linux-gnu/libEGL.so

如 1 月 8 日的上一次更新所示,通过 运行 文件安装驱动程序,EGL 确实适用于 libGL.so:

$ wget https://gist.githubusercontent.com/funchal/bff0a8d6dae5b3ace1a88c392416b5bc/raw/1427821a2390a30779881ab59c55b5550a468919/main.c
$ gcc main.c -lGL -lEGL
$ ./a.out
egl 1.5
renderer: Tesla K80/PCIe/SSE2
version: 4.6.0 NVIDIA 410.93

EGL 在链接 libOpenGL.so:

时也有效
$ wget https://gist.githubusercontent.com/funchal/bff0a8d6dae5b3ace1a88c392416b5bc/raw/1427821a2390a30779881ab59c55b5550a468919/main.c
$ gcc main.c -lOpenGL -lEGL
$ ./a.out
egl 1.5
renderer: Tesla K80/PCIe/SSE2
version: 4.6.0 NVIDIA 410.93

我不确定这是否相关,但我注意到 运行 文件和打包的驱动程序有不同的依赖关系链接到 libGL.so。 运行文件安装的驱动有如下依赖,包括libGLX.so:

$ ldd /usr/lib/x86_64-linux-gnu/libGL.so
    linux-vdso.so.1 =>  (0x00007fff28ce5000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fda5af05000)
    libGLX.so.0 => /usr/lib/x86_64-linux-gnu/libGLX.so.0 (0x00007fda5acd5000)
    libGLdispatch.so.0 => /usr/lib/x86_64-linux-gnu/libGLdispatch.so.0 (0x00007fda5aa02000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fda5a638000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fda5b3b2000)
    libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007fda5a2fe000)
    libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007fda5a0ec000)
    libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007fda59eca000)
    libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007fda59cc6000)
    libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007fda59ac0000)

虽然软件包安装的驱动程序不依赖于 libGLX.so,而是将 libnvidia-tls.so 和 libnvidia-glcore.so 作为依赖项:

$ ldd /usr/lib/nvidia-410/libGL.so
    linux-vdso.so.1 =>  (0x00007fff139dd000)
    libnvidia-tls.so.410.78 => /usr/lib/nvidia-410/tls/libnvidia-tls.so.410.78 (0x00007fed5efef000)
    libnvidia-glcore.so.410.78 => /usr/lib/nvidia-410/libnvidia-glcore.so.410.78 (0x00007fed5d414000)
    libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007fed5d0da000)
    libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007fed5cec8000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fed5cafe000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fed5c8fa000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fed5c5f1000)
    libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007fed5c3cf000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fed5f531000)
    libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007fed5c1cb000)
    libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007fed5bfc5000)

总结这个问题的最终修复:

Link 反对 libOpenGL.so 而不是 libGL.so!