구조체의 문자열 멤버 함수와 이상한 행동 :사이 썬 I는 다음과 같습니다 구조체를 가지고
foo.h :
struct A {
string a;
string b;
};
이 같은 .pyx 파일에 일치하는 정의가
이lib_foo.pyx :
cdef extern from "foo.h":
cdef struct A:
string a
string b
cdef class PyA:
cdef A* thisptr
def __cinit__(self):
self.thisptr = <A*>malloc(sizeof(A))
cdef A* getThis(self):
return self.thisptr
def bar(self):
self.thisptr.a = "Hello" # works fine!
def bar2(self):
return self.thisptr.a # this too!
def bar(PyA f):
f.getThis().a = "Hello"
def bar2(PyA a):
return f.getThis().a
이 아무 문제없이 잘 구축, 내가 얻을 아니라 파이썬 래퍼로 libfoo.so 나는 간단한 테스트 스크립트에서 사용하는, 그것의 :
import libfoo
f = libfoo.PyA()
#f.bar() no problems
libfoo.bar(f) # this line and the next have unpredictable behavior!
print libfoo.bar2(f)
이상 반복 실행을, 때로는이 성공적으로 "안녕하세요"인쇄되며, 다른 시간 세그먼트 폴트. 더 낯선 사람, bar와 bar2의 두 함수는 PyA 클래스의 멤버 함수처럼 잘 작동하는 것 같습니다. 클래스와 구조체에 대한 포인터를 제공하기 위해 getThis() 함수를 사용하여 많은 양의 cython을 래핑했습니다. 지금까지는 문제가 없었습니다. 문제의 원인이되는 문자열 일 수 있습니까?
편집 : 그것은 사소 생성자를 가지고 있기 때문에 setup.py
from distutils.core import setup
import distutils.util as du
from distutils.extension import Extension
from Cython.Distutils import build_ext
import os
os.environ["CC"] = "/app/gcc/4.8.2/bin/g++"
os.environ["CXX"] = "/app/gcc/4.8.2/bin/g++"
os.environ["CPP"] = "/app/gcc/4.8.2/bin/g++"
os.environ["CMAKE_CXX_COMPILER"] = "/app/gcc/4.8.2/bin/g++"
ext_modules = [
Extension(
name = "libfoo",
sources = ["lib_foo.pyx"],
include_dirs = ["/usr/local/include", "/usr/include"],
library_dirs = ["/usr/local/lib", "/usr/lib"],
language = "c++",
)]
setup(
name = "libfoo",
cmdclass = {"build_ext" : build_ext},
ext_modules = ext_modules
)
우리는 완벽하고 실행 가능한 예를 사용할 수 있습니까? 현재 컴파일되지 않습니다. – Veedrac
괜찮아요. 편집에 내 setup.py를 포함 시켰습니다. 그러나 그것은 잘 컴파일되어야합니다. 어떤 종류의 컴파일 오류가 발생합니까? – Ben