Boost.Python - 公开一个类

Boost.Python - Exposing a class

本文关键字:一个 Python Boost      更新时间:2023-10-16

>我有以下名为"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>());
}

在我的制作文件中,我正在编译 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时,我都会得到以下信息:

导入错误: Wav.so: 未定义的符号: _ZN8AudioLib3WavC1Eii

我哪里出错了?

看起来您未能定义第二个构造函数:

Wav(const int M, const int N);

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

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