¿Existe alguna forma de llamar código OpenGL escrito en C++ en Python a través de pybind11?
He escrito un ejemplo básico utilizando OpenGL y c++.
#include <gl glut.h="">
void init(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glMatrixMode(GL_PROJECTION);
glOrtho(-5, 5, -5, 5, 5, 15);
glMatrixMode(GL_MODELVIEW);
gluLookAt(0, 0, 10, 0, 0, 0, 0, 1, 0);
return;
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 0, 0);
glutWireTeapot(3);
glFlush();
return;
}
void test()
{
int argc = 0;
char **argv=NULL;
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(0, 0);
glutInitWindowSize(300, 300);
glutCreateWindow("OpenGL 3D View");
init();
glutDisplayFunc(display);
glutMainLoop();
}
Y luego compila el código usando:
gcc -o test test.c -lGL -lGLU -lglut
Funciona bien. Pero quiero llamar a esta función en Python, así que he intentado:
#include <pybind11 pybind11.h="">
...
PYBIND11_MODULE(py2cpp, m)
{
m.doc() = "opengl test";
m.def("display", &test, "test opengl");
}
Compila el código anterior usando:
g++ -shared -std=c++11 -fPIC `python3 -m pybind11 --includes` -lGL -lGLU -lglut test.cpp -o py2cpp`python3-config --extension-suffix` -I /home/xiaohanbao/anaconda3/envs/ros/include/python3.8
He compilado el código con éxito. Pero cuando importo la biblioteca usando import py2cpp
, obtengo el siguiente error:
Import Error: /path/py2cpp.cpython-38-x86_64-linux-gnu.so: undefined symbol: glutInitWindowPosition
¿Hay alguna forma de solucionarlo?
davy.ai
El error parece indicar que el enlazador no puede encontrar la definición de la función
glutInitWindowPosition
. Esto podría ser porque el enlazador no está enlazando con la biblioteca correcta que incluye esta función.Una posible solución es enlazar explícitamente con las bibliotecas necesarias agregando los flags del enlazador al comando de compilación de pybind11. Por ejemplo, intenta agregar los siguientes flags al comando de compilación:
Esto debería indicarle al enlazador que busque las funciones necesarias en el directorio
/usr/lib/x86_64-linux-gnu
y enlazar con las bibliotecasglut
,GL
yGLU
.El comando de compilación actualizado se vería así:
Después de reconstruir e importar la biblioteca, el error debería resolverse.