使用boost python编译在python代码内部调用的c ++代码时出错

Posted

技术标签:

【中文标题】使用boost python编译在python代码内部调用的c ++代码时出错【英文标题】:error while compiling a c++ code which is called inside of a python code, with boost python 【发布时间】:2019-09-14 11:15:59 【问题描述】:

我在 Python 中开始了一个项目,我想使用一些图像对象。我想在我的 Python 代码中调用一些 C++ 函数。经过一番研究,我决定使用 Python Boost 库在我的 Python 代码中调用 C++ 函数。

我的 Boost 版本是:libboost_python3-py36.so.1.65.1。 我正在使用 Python v3.6。

我在 CppProject.cpp 中编写了这样的 C++ 代码:


char const* myMethod() 
    // do some operations ...


    return "It is Done";


#include <boost/python.hpp>

BOOST_PYTHON_MODULE(CppProject) 
    boost::python::def("getTryString", myMethod); // boost::python is the namespace


另外,我像这样创建了我的 CMakeLists.txt:

cmake_minimum_required(VERSION 2.8.3)
FIND_PACKAGE(PythonInterp)
FIND_PACKAGE(PythonLibs)
FIND_PACKAGE(Boost COMPONENTS python)

INCLUDE_DIRECTORIES($Boost_INCLUDE_DIRS $PYTHON_INCLUDE_DIRS)

PYTHON_ADD_MODULE(NativeLib CppProject)
FILE(COPY MyProject.py DESTINATION .) # See the whole tutorial to understand this line

最后,这是我在 MyProject.py 中的 Python 代码:

import NativeLib
# some preprocess
print (NativeLib.getTryString)

编写代码后,我创建了一个名为 build 的目录。 在那个目录中,我运行了这个命令:

cmake -DCMAKE_BUILD_TYPE=Release ..

在那之后,在我运行我的 Python 代码之前,我确实做到了,最后,我运行了我的 python 代码,但是发生了分段错误!

有人可以帮我解决这个错误吗?

【问题讨论】:

你能提取一个minimal reproducible example吗?此外,您使用的 Python 和 Boost 版本可能很重要。 与您的当前问题无关,但 Python 脚本并没有真正调用该函数。 当您创建 minimal reproducible example 向我们展示时,还包括构建该示例的 fullcomplete 错误输出,包括任何可能的信息笔记。并且不要忘记该示例需要向我们展示您拥有的所有#include 指令(简而言之,我们应该可以复制粘贴它并尝试复制错误)。 你没有包含boost头文件 你说你“写了我的 c++ 代码 like 这个”(强调我的)...这真的是你使用的 exact 代码吗?不包括任何头文件? 【参考方案1】:

编译器需要在您使用它们之前声明您在程序中使用的所有符号。如果您使用尚未声明的符号,它将给您一个错误,因为它不知道。

现在当您使用BOOST_PYTHON_MODULE 时,编译器不知道该符号,因此整个语句在语法上是错误的。

您必须包含定义 BOOST_PYTHON_MODULE 宏以及 boost::python::def 的 Boost 头文件。

【讨论】:

你是对的。我将 #include 添加到我的 c++ 代码中,然后它就正确了。但是当我运行我的 python 代码时,发生了分段错误。

以上是关于使用boost python编译在python代码内部调用的c ++代码时出错的主要内容,如果未能解决你的问题,请参考以下文章

减少 Boost Python 编译时间

无法在 Boost.Python 中使用 __stdcall 编译示例

编译时与 Boost.python 链接错误

Boost.Python dll 在编译时被跳过

在 Windows 下使用 SCons 构建 boost::python 模块

Boost.Python 创建的 dll 无法导入(遵循 Boost Python 的 QuickStart)