Почему этот минимальный пример SDL/OpenGL работает при связывании с GL, а не с OpenGL?

#c #linux #ubuntu #opengl #sdl

Вопрос:

В приведенном ниже примере кода он имеет два разных поведения в зависимости от того, связываюсь ли я с libGL.so против libOpenGL.so. Это в системе Ubuntu 20.04 с графическим процессором PCI Radeon. Поведение в обоих случаях заключается в том, что он переключает видеорежимы. В случае «плохой/OpenGL» функция glGetString() возвращает значение NULL, а в случае «хорошей/GL» функция glGetString() возвращает строку.

Почему это не работает при связывании с OpenGL? Когда следует устанавливать связь с OpenGL vs GL?

Связывание, которое работает: g test.cpp -o testgood -lGL -lGLU -lSDL

Связывание, которое не работает: g test.cpp -o testbad -lOpenGL -lGLU -lSDL

 #include <stdio.h>
#include <SDL/SDL.h>
#include <GL/glut.h>

int main()
{
    SDL_Init( SDL_INIT_VIDEO );
    SDL_SetVideoMode( 800, 600, 32, SDL_OPENGL | SDL_FULLSCREEN );

    const unsigned char * tmp = glGetString(GL_RENDERER);
    if (tmp == NULL)
    {
        printf ("CAN'T DETERMINE RENDERERn"); // Links with OpenGL
        SDL_Quit();
        return false;
    }
    else
    {
        printf ("%sn", (const char *) tmp); // Links with GL
        return true;
    }
}
 

Комментарии:

1. pci express может быть?

2. Я имею в виду дискретный графический процессор, не интегрированный в центральный процессор. Я не уверен, что это лучший термин для этого. Но да, вероятно, PCIe, а не PCI.

3. Для «плохого» случая SDL_SetVideoMode() возвращает ненулевое SDL_Surface* значение ? IIRC компоновщик будет молча игнорировать библиотеки, которые он не может найти; libOpenGL.so установлен?

4. libOpenGL.so устанавливается из пакета libopengl-dev. В обоих случаях я получаю ненулевую SDL_Surface. Мой полный код проверяет ошибки на этом и SDL_Init.

5. Не могу повторить в моем окне Kubuntu 20.04 (дискретный AMD Vega 56 ), -lOpenGL вариант возвращает допустимое GL_RENDERER значение .