es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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?

Tags:  , , ,

Answer

  1. Avatar for 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:

    -L/usr/lib/x86_64-linux-gnu -lglut -lGL -lGLU
    

    Esto debería indicarle al enlazador que busque las funciones necesarias en el directorio /usr/lib/x86_64-linux-gnu y enlazar con las bibliotecas glut, GL y GLU.

    El comando de compilación actualizado se vería así:

    g++ -shared -std=c++11 -fPIC `python3 -m pybind11 --includes` -L/usr/lib/x86_64-linux-gnu -lglut -lGL -lGLU test.cpp -o py2cpp`python3-config --extension-suffix` -I /home/xiaohanbao/anaconda3/envs/ros/include/python3.8
    

    Después de reconstruir e importar la biblioteca, el error debería resolverse.

Comments are closed.