使用Boost Python将C ++函数扩展到Python

时间:2018-08-30 20:25:35

标签: python c++ boost-python

我正在尝试包装两个要在Python中使用的c ++文件。我正在使用boost python库。这些文件似乎可以正确编译,但是导入模块会导致“ ImportError:未定义符号”错误。

此问题与boost没有正确找到依赖的c ++文件有关,但是我不清楚如何添加它们。

Python版本:2.7.12 Boost版本:1.58 操作系统:Ubuntu 16.04

我的代码结构如下:

hellomodule.cpp

#include <iostream>
#include <cstdint>
#include "test.h"

using namespace std;

void say_hello(const char* name) {
    cout << "Hello " <<  name << "!\n";
    run_test();
}

#include <boost/python/module.hpp>
#include <boost/python/def.hpp>
using namespace boost::python;

BOOST_PYTHON_MODULE(hello)
{
    def("say_hello", say_hello);
}

test.cpp

#include "test.h"
using namespace std;

void run_test(void){
    cout << "Sup";
}

setup.py

#!/usr/bin/env python
from distutils.core import setup
from distutils.extension import Extension

module1 = Extension("hello",
                    sources = ["hellomodule.cpp", "test.cpp"],
                    libraries = ["boost_python"],
                    extra_compile_args=['-std=c++11'])

setup(name="PackageName",
    ext_modules=[module1])

从命令行运行“ python setup.py build”,该文件创建了hello.so文件。当我尝试导入“ hello”时,出现“ ImportError:./hello.so:undefined symbol:_Z8run_testv”

如果有人可以向我指出正确的方向,将不胜感激。

1 个答案:

答案 0 :(得分:0)

似乎您周围有一些过时的文件。通过从test.cpp的{​​{1}}中省略了sources,我可以重现此问题。在这种情况下,它可以很好地构建,但是正如您所观察到的那样,它不会导入。可能是Python在添加setup.py之前找到了先前构建的hello.so版本。

我建议删除test.cpp目录和可能存在的build的任何副本,并尝试从头开始运行构建。