2013-10-24 27 views
4

我有一個巨大的gl.pxd文件,其中包含gl.hglu.hglut.h的所有定義。例如,它有這些行:找不到符號,預計於:flat命名空間

cdef extern from '<OpenGL/gl.h>': 
    ctypedef unsigned int GLenum 
    cdef void glBegin(GLenum mode) 

我有一個window.pyx文件,它看起來像這樣:

# Import OpenGL definitions 
# headers of gl, glu and glut 
from gl cimport * 

cdef int argcp 
cdef char **argv 

cdef void render_scene(): 

    glClear(GL_COLOR_BUFFER_BIT) 

    glBegin(GL_TRIANGLES) 
    glVertex2f(-.5, -.5) 
    glVertex2f(.5, 0) 
    glVertex2f(0, -5.) 
    glEnd() 

    glutSwapBuffers() 

cpdef main(): 
    # Initialize GLUT and create Window 
    glutInit(&argcp, argv) 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE) 
    glutInitWindowPosition(100, 100) 
    glutInitWindowSize(1280, 720) 
    glutCreateWindow('My Shiny New Window') 

    # Register callbacks 
    glutDisplayFunc(render_scene) 

    # Enter GLUT event processing cycle 
    glutMainLoop() 

我也有一個setup.py它看起來像這樣:

from distutils.core import setup 
from distutils.extension import Extension 
from Cython.Distutils import build_ext 

setup(
    cmdclass = {'build_ext': build_ext}, 
    ext_modules = [Extension('window', ['window.pyx'])] 
) 

哪我打電話給python3 setup.py build_ext --inplace並編譯,輸出結果如下:

running build_ext 
cythoning window.pyx to window.c 
building 'window' extension 
/usr/bin/clang -fno-strict-aliasing -fno-common -dynamic -DNDEBUG -g -O3 -arch i386 -arch x86_64 -I/Library/Frameworks/Python.framework/Versions/3.3/include/python3.3m -c window.c -o build/temp.macosx-10.6-intel-3.3/window.o 
/usr/bin/clang -bundle -undefined dynamic_lookup -arch i386 -arch x86_64 -g build/temp.macosx-10.6-intel-3.3/window.o -o /Users/petervaro/cygl/window.so 

而且我有一個window_test.py它看起來像這樣:

import window 
window.main() 

但是,如果我想運行這條巨蟒片斷我得到這個錯誤:

Traceback (most recent call last): 
    File "/Users/petervaro/cygl/window_test.py", line 3, in <module> 
    import window 
ImportError: dlopen(/Users/petervaro/cygl/window.so, 2): Symbol not found: _glBegin 
    Referenced from: /Users/petervaro/cygl/window.so 
    Expected in: flat namespace 
in /Users/petervaro/cygl/window.so 

我的問題是真正與此類似: What is the meaning of this ImportError when importing a Cython generated .so file? - 雖然afaik我沒有外部庫,我想用內建的 OpenGL庫...

哦,我在Mac OS X 10.8.5,Cython 19.2和Python 3.3。 任何幫助將不勝感激!

在此先感謝!

回答

6

即使OpenGL和GLUT在系統上(內建)我將它們連接在編譯過程框架,所以setup.py應該是這樣的:

from distutils.core import setup 
from distutils.extension import Extension 
from Cython.Build import cythonize 

exts = Extension(name='window', 
        sources=['window.pyx'], 
        extra_link_args=['-framework', 'OpenGL', '-framework', 'GLUT']) 

setup(name='cygl', 
     ext_modules = cythonize(exts))