在C 中使用PYBIND11包装器时,SegFault



我有一个具有以下结构的示例。

├── CMakeLists.txt
├── ext
│   └── pybind11
└── main.cpp

cmakelists.txt

cmake_minimum_required(VERSION 3.5)
project(notworking)
add_subdirectory(ext/pybind11)
add_executable(notworking
  main.cpp)
target_link_libraries(notworking PRIVATE python3.6m)
target_link_libraries(notworking PRIVATE pybind11)

main.cpp

#include <pybind11/pybind11.h>
namespace py = pybind11;
int main() { py::object decimal = py::module::import("decimal"); }

现在运行

╰─ ./notworking
[1]    14879 segmentation fault (core dumped)  ./notworking

我错过了什么可以在这里正确加载此模块?我已经搜查了文档,特别是"构建系统"部分,但已经空了。

在C 中使用PYBIND11中的其他包装器时,这似乎也是如此。

我已经有一个修改了您的示例版本,可以同时使用本地和本机模块运行。基本过程如下:

安装Python3.6,Python3.6-DEV和CMAKE(最新3.10)。我只安装了Python3.6(版本3.6.3)

从Github和Unzip下载Pybind11-Master。在未拉链的文件夹中:

mkdir build
cd build
cmake ..
make check -j 4
sudo make install

用简单的main.cpp和calc.py来源创建"不工作"项目:

main.cpp:

#include <pybind11/embed.h> 
namespace py = pybind11;
int main() {
    py::scoped_interpreter guard{};
    py::print("Hello, World!"); 
    py::module decimal = py::module::import("decimal");
    py::module calc = py::module::import("calc");
    py::object result = calc.attr("add")(1, 2);
    int n = result.cast<int>();
    assert(n == 3);
    py::print(n);
}

calc.py(必须存在于同一文件夹中:)

def add(i, j):
    return i + j

我的简单cmakelists.txt文件:

cmake_minimum_required(VERSION 3.5)
project(notworking)
find_package(pybind11 REQUIRED) 
add_executable(notworking main.cpp)
target_link_libraries(notworking PRIVATE pybind11::embed)

构建和运行提供输出:

Hello, World!
3

希望这有帮助。

相关内容

  • 没有找到相关文章

最新更新