2017-12-11 140 views
0

次の構造の例があります。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 

このモジュールを正しくロードするには、何が欠けていますか?私はdocumentation、特にビルドシステムのセクションを精査しましたが、空になっています。

C++からpybind11で他のラッパーを使用していると、私の場合もそうです。

答えて

2

ローカルモジュールとネイティブモジュールの両方で実行するためのサンプルの修正版があります。基本的な手順は次のとおりです:

python3.6、python3.6-devとCMake(3.10最新)をインストールします。私はpython3.6しかインストールしていません(バージョン3.6.3)

githubからpybind11-masterをダウンロードし、解凍してください。解凍したフォルダで:

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(この必見

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

シンプルmain.cppにとcalc.pyソースとの "notworking" プロジェクトを作成します。同じフォルダに存在する:)

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

私の簡単なCMakeLists.txtファイル:

これは、いくつかの助けである

Hello, World! 
3 

希望:

cmake_minimum_required(VERSION 3.5) 
project(notworking) 

find_package(pybind11 REQUIRED) 

add_executable(notworking main.cpp) 
target_link_libraries(notworking PRIVATE pybind11::embed) 

のビルドと実行には、出力を提供します。