我已经制作了一个C ++库,并从中构建了一个.dylib动态库。但是,当我用ctypes加载它时,它失败了。某些东西似乎没有正确联系。我不知道为什么。错误(相关部分):
cscalelib.setup_framebuffer(flip,surface.frame_buffer,surface.texture,surface._scale[0],surface._scale[1])
File "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/ctypes/__init__.py", line 325, in __getattr__
func = self.__getitem__(name)
File "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/ctypes/__init__.py", line 330, in __getitem__
func = self._FuncPtr((name_or_ordinal, self))
AttributeError: dlsym(0x56ecd0, setup_framebuffer): symbol not found
这是C ++代码,它仍在进行中,但应该与我到目前为止一样。
#include <OpenGL/gl.h>
#include <OpenGL/glu.h>
#include <vector.h>
void setup_framebuffer(bool flip,GLuint frame_buffer_id,GLuint texture_id,int width,int height){
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, frame_buffer_id);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, texture_id, 0);
glPushAttrib(GL_VIEWPORT_BIT);
glViewport(0,0,width,height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity(); //Load the projection matrix
if (flip){
gluOrtho2D(0,width,height,0);
}else{
gluOrtho2D(0,width,0,height);
}
}
void end_framebuffer(){
glPopAttrib();
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity(); //Load the projection matrix
gluOrtho2D(0,1280,720,0); //Set an orthorgraphic view
}
void add_lines(bool antialias,vector< vector<double> > coordinates,double w,double r,double g, double b,double a){
glDisable(GL_TEXTURE_2D);
if (antialias){
glEnable(GL_LINE_SMOOTH); //Enable line smoothing.
}
glColor4d(r,g,b,a);
glLineWidth(w);
glBegin(GL_LINE_STRIP);
for (int x = 0; x < coordinates.size(); x++) {
glVertex2d(coordinates[x][0],coordinates[x][1]);
}
glEnd();
if (antialias){
glDisable(GL_LINE_SMOOTH); //Disable line smoothing.
}
glEnable(GL_TEXTURE_2D);
}
我编译它:
g ++ -dynamiclib CPPEXTSCALELIB.cp -framework opengl -arch i386 -o CPPEXTSCALELIB.dylib
这是带有“...”的Python代码来表示不相关的部分。
...
from ctypes import *
...
cscalelib = CDLL(os.path.dirname(sys.argv[0]) + "/CPPEXTSCALELIB.dylib")
...
def setup_framebuffer(surface,flip=False):
#Create texture if not done already
if surface.texture is None:
create_texture(surface)
#Render child to parent
if surface.frame_buffer is None:
surface.frame_buffer = glGenFramebuffersEXT(1)
cscalelib.setup_framebuffer(flip,surface.frame_buffer,surface.texture,surface._scale[0],surface._scale[1])
...
谢谢。
答案 0 :(得分:3)
问题很可能是您正在使用C ++,因此函数名称将被破坏并使用C ++调用约定。如果使用extern "C"
声明函数,那么它应该以可从C代码(以及Python的CTypes模块)调用的方式导出。