如何使用PyBind在C ++中嵌入Python而不是使用CMake?

时间:2017-12-06 16:24:02

标签: c++ makefile g++ pybind11

我试图用PyBind在C ++中嵌入一些Python代码。大多数文档都是用C ++扩展Python,但我对嵌入感兴趣:

http://pybind11.readthedocs.io/en/stable/advanced/embedding.html上有一个简单的cmake示例。但是对于我的项目,我必须扩展一个makefile。

是否可以更改此示例

cmake_minimum_required(VERSION 3.0)
project(example)

find_package(pybind11 REQUIRED)  # or `add_subdirectory(pybind11)`

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

使用此c ++文件

#include <pybind11/embed.h> // everything needed for embedding
namespace py = pybind11;

int main() {
    py::scoped_interpreter guard{}; // start the interpreter and keep it alive

    py::print("Hello, World!"); // use the Python API
}

到带有makefile的版本?

1 个答案:

答案 0 :(得分:1)

这很简单。您需要进行以下更改:

  1. 将pybind11 include目录添加到includes(-I标志)。
  2. 将Python 3标头添加到include(-I标志)。
  3. 将Python 3库添加到库中(-L标志)。
  4. Python的python3-config程序是做#2和#3的最佳方式。

    例如,如果您的makefile看起来像这样:

    %.o: %.cc
        $(CXX) -o $@ -c $^
    
    main: main.o
        $(CXX) -o $@ $^
    

    然后你需要改变它:

    %.o: %.cc
        $(CXX) -o $@ -c $^ -Ipath/to/pybind11-2.2.3/include $(shell python3-config --includes)
    
    main: main.o
        $(CXX) -o $@ $^ $(shell python3-config --libs)
    

    实际上,Makefile可能包含给出包含路径,C ++编译器标志,库和/或链接器标志的变量,因此您可以在那里添加-Ipython3-config个调用。