Boost.Python - 暴露一个类

Posted

技术标签:

【中文标题】Boost.Python - 暴露一个类【英文标题】:Boost.Python - Exposing a class 【发布时间】:2013-11-16 16:19:24 【问题描述】:

我有以下名为“Wav”的类,它存储在另一个目录中,文件为“Wav.h”和“Wav.cpp”,如下所示:

enum ReadType 
   NATIVE = 0,
   DOUBLE,
;

namespace AudioLib 
    class Wav : public Signal 
        public: 

           Wav(); 
           Wav(const int M, const int N);

           ///...  ->
    ;
 ;

.cpp 文件包含这个类的实现,一切都编译得很好。

我正在尝试使用 boost.python 实现 Python 包装器并拥有以下文件:

#include <boost/python.hpp>
#include "../src/Wav/Wav.h"

using namespace boost::python;

BOOST_PYTHON_MODULE(Wav)
       
    class_<AudioLib::Wav>("Wav", 
          init<const int, const int>());

在我的 Makefile 中,我正在编译 Wav.cpp:

# Compile the .wav Python and Cpp file 
$(WAV_TARGET).so: $(WAV_TARGET).o
g++ -shared -Wl,--export-dynamic $(WAV_TARGET).o -L$(BOOST_LIB) -lboost_python -
    lboost_python -L/usr/lib/python$(PYTHON_VERSION)/config -lpython$(PYTHON_VERSION) -o 
    $(WAV_TARGET).so

$(WAV_TARGET).o: $(WAV_TARGET).cpp
g++ $(CFLAGS) ../src/Wav/Wav.cpp -I$(PYTHON_INCLUDE) -I$(BOOST_INC) -fPIC -c 
        $(WAV_TARGET).cpp 

每当我尝试导入 Python 时,我都会得到以下信息:

ImportError: Wav.so: undefined symbol: _ZN8AudioLib3WavC1Eii

我哪里错了?

【问题讨论】:

【参考方案1】:

您似乎未能定义第二个构造函数:

Wav(const int M, const int N);

我可以通过使用内联定义制作示例的工作(但简化)副本并仅删除该构造函数的定义来复制错误消息。所以我的建议是仔细检查 Wav.cpp 中的定义,并尝试创建一个内联定义来进行实验。

如果定义确实存在,则链接器标志可能不正确。

【讨论】:

以上是关于Boost.Python - 暴露一个类的主要内容,如果未能解决你的问题,请参考以下文章

删除由 boost::python 暴露的 std::vector 中的一个指针

Boost.Python 如何拥有 C++ 类?

使用 Boost.Python 设置包装类的元类

Boost不将模块暴露给python

Boost.Python 列出所有暴露的类和属性

在 boost python 中暴露 C++ 接口