скомпилируйте cython с классом C++ и получите неопределенные символы

Я попытался обернуть класс C++ с помощью cython, он компилируется нормально, но когда я импортирую расширение, я получаю t

ImportError: ./svd.so: undefined symbol: _ZTI5model

Вот заголовочные файлы C++:

во-первых, "model.h", модель - это базовый класс свд.

// model.h
#ifndef MODEL_H_
#define MODEL_H_

#include "common.h"
#include "Data.h"
class model {
protected:
    Data data;
public:
    model(Data& data);
    virtual float predict(uint uid, uint mid);
    // evaluate using testset and return final RMSE
    virtual float evaluate();
    // put predictions to file
    void output(string filename);
    virtual void onestep();
    virtual ~model();
};

#endif /* MODEL_H_ */

тогда svd.h, svd наследует модель.

// svd.h
#ifndef SVD_H_
#define SVD_H_
#include "../common.h"
#include "../model.h"
#include "../Data.h"
#define K_NUM 50

namespace SVD{

class svd : model {

public:
    svd(Data &data);
    void init(uint max_step, float alpha1, \
              float alpha2,  float beta1, float beta2); 
    float predict(UidType uid, ItemType mid);
    float evaluate();
    void onestep();
    ~svd();
}; // end class svd

void initModel(uint max_step, float alpha1, float alpha2,  float beta1, float beta2);

};// end namespace svd

#endif /* SVD_H_ */

наконец, файл pyx

# distutils: language = c++
# distutils: sources = ../model.cpp ../models/svd.cpp ../common.cpp ../Data.cpp ../model.cpp

cdef extern from "../models/svd.h" namespace "SVD":
    cdef cppclass svd:
        pass

и мой файл setup.py

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

setup(ext_modules = cythonize(
   ["svd.pyx"],                 # our Cython source
   language="c++",             # generate C++ code
))

Я думаю, что «модель» Symbol может быть базовым классом svd,


person Superjom    schedule 05.04.2013    source источник


Ответы (1)


Вы должны предоставить реализацию виртуальных методов в базовом классе или (если класс предполагается абстрактным) объявить их чистыми. См., например. этот вопрос.

person Robert Franke    schedule 09.04.2013