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

Extending C++ functions to Python using Boost Python

我正在尝试打包两个要在 Python 中使用的 c++ 文件。我正在使用 boost python 库。文件似乎可以正确编译,但导入模块会导致 "ImportError: undefined symbol" 错误。

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

Python版本:2.7.12 升压版本:1.58 OS: 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"

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

您似乎有一些过时的文件。我能够通过从 setup.py 中的 sources 中省略 test.cpp 来重现该问题。在这种情况下,它构建得很好,但正如您所观察到的那样,它不会导入。可能 Python 正在寻找您之前在添加 test.cpp 之前构建的 hello.so 版本。

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