Я пытаюсь создать статическую шейдерную библиотеку с OpenGL. Я хочу, чтобы он был как можно более переносимым (Windows Linus Android...). Для этого предлагаем создать заголовок, который включает gl и glext: OpenGL.hpp
...
#define GL_GLEXT_PROTOTYPES
#if defined(OS_WINDOWS)
#ifdef _MSC_VER
#include <windows.h>
#endif
#include <GL/gl.h>
#include <GL/glext.h>
#elif defined(OS_LINUX)
#include <GL/gl.h>
#include <GL/glext.h>
...
И Shader.hpp
...
class Shader
{
unsigned int m_id;
public:
Shader();
...
};
...
И Shader.cpp
...
#include <Shader.hpp>
#include <OpenGL.hpp>
Shader::Shader()
{
m_id = glCreateProgram();
...
}
...
Затем выполнил Shader.cpp
в Shader.o
и с помощью ar
created libShader.a
. После этого на Android я могу скомпилировать:
g++ -I ./include -c main.cpp -o main.o
g++ -L ./lib -o main main.o -lShader -lSDL2 -lGLESv1_CM -lGLESv2
И он работает безупречно. Но на окнах, когда я связываю
g++ -L ./lib -o main.exe main.o -lShader -lSDL2 -lglew32 -lopengl32 -lglu32
G++ дает lib\libShader.a(Shader.o):Shader.cpp undefined reference to glCreateProgram@8
. На окнах main.cpp выглядит так:
#include <GL/glew.h>
#include <Shader.hpp>
...
int main()
{
Shader shader1;
...
GLuint test_id_for_main = glCreateProgram();
...
}
...
Простейшая вещь - test_id_for_main
работает (если я прокомментирую Shader-s) без ошибки ссылки. Что я сделал неправильно на окнах?
В итоге я создал свои собственные заголовки OpenGL и загрузил функции с помощью wgl/glx/dlopen
-DGLEW_STATIC
.