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

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

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

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

Во-первых, «model.h», модель является базовым классом SVD.

// 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
))

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

1

Решение

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector