Tôi đang cố gắng sao chép công việc của Flavian Coelho, linked here. Ông đã sử dụng Cython và Thư viện khoa học Gnu (GSL) để có được tốc độ lớn hơn so với Python trong việc tạo ra các số ngẫu nhiên. Khi tôi nhập mã Cython biên soạn của tôi trong Python (với lệnh import cgibbs
), tôi nhận được lỗi sau:NhậpError từ Cython khi liên kết thư viện C bên ngoài
ImportError: dlopen(./cgibbs.so, 2): Symbol not found: _gsl_rng_mt19937
Referenced from: /Users/wesley/scratch/cython/cgibbs.so
Expected in: dynamic lookup
Bạn sẽ nhận thấy rằng đơn khiếu nại là biểu tượng _gsl_rng_mt19937
không thể được tìm thấy. Hàm tôi đang cố gắng liên kết đến được gọi là gsl_rng_mt19937
(không có dấu gạch dưới hàng đầu) và đó là cách nó xuất hiện trong tệp .pyx
của tôi. Tôi nghĩ Cython là bằng cách nào đó gây ra vấn đề bằng cách thêm dấu gạch dưới hàng đầu đó.
Để khắc phục sự cố dễ dàng hơn, tôi đã xóa mã và đăng mã bên dưới. Hệ thống của tôi là: Mac OSX 10.7 (Sư tử) chạy Python 2.7.2 (32 bit), gcc-4.0 (mà tôi đã sử dụng để biên dịch thư viện GSL dưới dạng 32 bit), GSL 1.15 và Cython v0.15.1.
Dưới đây là nội dung của cgibbs.pyx:
#declaring external GSL functions to be used
cdef extern from "math.h":
double sqrt(double)
cdef double Sqrt(double n):
return sqrt(n)
cdef extern from "gsl/gsl_rng.h":
ctypedef struct gsl_rng_type:
pass
ctypedef struct gsl_rng:
pass
gsl_rng_type *gsl_rng_mt19937
gsl_rng *gsl_rng_alloc(gsl_rng_type * T)
cdef extern from "gsl/gsl_randist.h":
double gamma "gsl_ran_gamma"(gsl_rng * r,double,double)
double gaussian "gsl_ran_gaussian"(gsl_rng * r,double)
cdef gsl_rng *r = gsl_rng_alloc(gsl_rng_mt19937)
Các lỗi sẽ biến mất nếu tôi nhận xét ra dòng cuối cùng của cgibbs.pyx
của tôi, nhưng sau đó tôi không thể thực sự sử dụng thư viện bên ngoài ... Bất kỳ cái nhìn sâu sắc mà bạn có thể cung cấp được đánh giá cao. Cảm ơn!
Tôi không biết từ SWIG - có lẽ tôi nên, mặc dù. – Wesley