C ++ библиотека для Python - проблемы с линковкой - PullRequest
1 голос
/ 12 декабря 2011

Я написал библиотеку 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

1 Ответ

2 голосов
/ 12 декабря 2011

неопределенный символ: _ZN6MatrixC2ERKS_

Это потому, что вам не хватает конструктора копирования Matrix::Matrix(const Matrix&) в вашей общей библиотеке:

samm@mac ~> echo _ZN6MatrixC2ERKS_ | c++filt 
Matrix::Matrix(Matrix const&)
samm@mac ~> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...