Python Engestuff:无法找到自定义C++ MODU的符号

2024-10-02 00:33:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我在C++中创建了2个模块,并通过Cython将它们导入到Python中。 第一个模块称为Generator,它包含两个类:MersenneTwister,它实现生成伪随机数的算法;Generator类是一个singleton,创建一个MersenneTwister对象。 第二个模块称为KMeans,它包含一个调用KMeans的函数,该函数实现用于聚类数据的K-Means算法。 然后使用python.I为python和.I创建了相应的文件,然后用python.I创建了相应的文件KMeans.所以python中的文件,接收:ImportError:/KMeans.所以:未定义符号:_ZN9Generator8instanceEv

我用g++-shared-pthread-fPIC-fwrapp-fno strict aliasing-o编译了.cpp文件文件.so文件.cpp在

# KMeans.pyx files 

include "Generator.pyx"
from libcpp.vector cimport vector
cdef import from "KMeans.h" :

           cdef struct Pair:

               vector[vector[double]] C
               vector[unsigned int] J

               Pair(vector[vector[double]] _C, vector[unsigned int] _J)

           cdef double s(vector[double] X, vector[double] c)
           cdef void   AddToCodeword(vector[double] X, vector[double] c)
           cdef Pair KMeans(unsigned int k, vector[vector[double]] X) except +

def KMean(unsigned k, X):

   cdef Pair returnValue = KMeans(k, X)

   return returnValue.C, returnValue.J

#Generator.pyx file


cdef extern from "mt.h":

    cppclass MersenneTwister:

       MersenneTwister()

       #public members
       double random() 
       void init_genrand(unsigned long s)
       void init_by_array(unsigned long* init_key, int key_length)
       unsigned long genrand_int32()
       long genrand_int31()
       double genrand_real1()
       double genrand_real2()
       double genrand_real3()
       double genrand_res53()

       #private members
       unsigned long* mt_
       int mti_
       unsigned long* init_key_
       int key_length_ 
       unsigned long s_
       int seeded_by_array_ 
       int seeded_by_int_

#static members
cdef extern from "mt.h" namespace "MersenneTwister":

       int N                    = 624
       int M                    = 397
       unsigned long MATRIX_A   = 0x9908b0dfUL
       unsigned long UPPER_MASK = 0x80000000UL
       unsigned long LOWER_MASK = 0x7fffffffUL

cdef extern from "generator.h" namespace "Generator":

    MersenneTwister *_ptr_
    MersenneTwister *instance()
    MersenneTwister *instance(unsigned int seed)

Tags: 文件keyfrominitgeneratorlongintdouble

热门问题