Я написал библиотеку c ++ и пытаюсь сделать привязки к ней с помощью boost :: python.Это упрощенная версия файла, где я определяю их:
#include <boost/python.hpp>
#include <matrix.h>
#include <string>
using namespace boost::python;
class MatrixForPython : public Matrix{
public:
MatrixForPython(int size) : Matrix(size) {}
std::string hello(){
return "this method works";
}
};
BOOST_PYTHON_MODULE(matrix){
class_<MatrixForPython>("Matrix", init<int>())
.def("hello", &MatrixForPython::hello);
}
Компиляция выполняется CMake, и вот мой CMakeLists.txt:
project(SomeProject)
cmake_minimum_required(VERSION 2.8)
# find and include boost library
find_package(Boost COMPONENTS python REQUIRED)
find_package(PythonLibs REQUIRED)
include_directories(${PYTHON_INCLUDE_PATH})
include_directories(${Boost_INCLUDE_DIR})
include_directories(.)
# compile matrix manipulation library
add_library(matrix SHARED matrix.cpp python_bindings.cpp)
set_target_properties(matrix PROPERTIES PREFIX "")
target_link_libraries(matrix
${Boost_LIBRARIES} ${PYTHON_LIBRARIES})
Компиляция завершается без ошибок, нокогда я пытаюсь запустить простой скрипт на Python:
import matrix
я получаю следующую ошибку
undefined symbol: _ZN6MatrixC2ERKS_
Что меня больше всего удивляет, так это тот факт, что когда я изменяю MatrixForPython
, не выводить изMatrix
все работает как положено.Что я должен изменить, чтобы заставить это работать?
РЕДАКТИРОВАТЬ: matrix.h
:
#ifndef MATRIX_H_
#define MATRIX_H_
#include <boost/shared_array.hpp>
class Matrix{
public:
// creates size X size matrix
Matrix(int size);
// copy constructor
Matrix(const Matrix& other);
// standard arithmetic operators
const Matrix operator * (const Matrix& other) const;
const Matrix operator + (const Matrix& other) const;
const Matrix operator - (const Matrix& other) const;
// element manipulation
inline void set(int row, int column, double value){
m_data[row*m_size + column] = value;
}
inline double get(int row, int col) const{
return m_data[row*m_size + col];
}
// norms
double frobeniusNorm() const;
double scaledFrobeniusNorm() const;
double firstNorm() const;
double infNorm() const;
// entire array manipulation
void zero(); // sets all elements to be 0
void one(); // identity matrix
void hermite(); // hermite matrix
virtual ~Matrix();
// less typing
typedef boost::shared_array<double> MatrixData;
private:
int m_size;
MatrixData m_data;
};
#endif