使用 cmake 和 pybind11 构建示例应用程序时未找到 Python.h

Ste*_*nko 5 c++ python ubuntu cmake pybind11

我想用 pybind11 构建简单的应用程序,pybind 已经使用 cmake (和 make install)安装在我的 Ubuntu 系统中。我使用这个简单的 cmake 文件:

cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(trt_cpp_loader )
find_package(pybind11 REQUIRED)
add_executable(trt_cpp_loader main.cpp)
set_property(TARGET trt_cpp_loader PROPERTY CXX_STANDARD 11)
Run Code Online (Sandbox Code Playgroud)

这是main.cpp:

#include <iostream>
#include <pybind11/embed.h>
namespace py = pybind11;

using namespace std;
int main(){return 0;}
Run Code Online (Sandbox Code Playgroud)

当我构建它时,我得到:

In file included from /usr/local/include/pybind11/pytypes.h:12:0,
                 from /usr/local/include/pybind11/cast.h:13,
                 from /usr/local/include/pybind11/attr.h:13,
                 from /usr/local/include/pybind11/pybind11.h:44,
                 from /usr/local/include/pybind11/embed.h:12,
                 from /home/stiv/lpr/trt_cpp_loader/main.cpp:2:
/usr/local/include/pybind11/detail/common.h:112:10: fatal error: Python.h: No such file or directory
 #include <Python.h>
          ^~~~~~~~~~
compilation terminated.
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?(python-dev和python3-dev已经安装,Python.h可用)

Wen*_*kob 6

您将需要使用该pybind11_add_module命令(请参阅https://pybind11.readthedocs.io/en/stable/compiling.html#building-with-cmake)来创建扩展模块的默认情况。

如果目标确实是将 Python 嵌入到可执行文件中,则您有责任将 python 标头和库显式添加到 CMake 中的编译器/链接器命令中。(请参阅https://pybind11.readthedocs.io/en/stable/compiling.html#embedding-the-python-interpreter了解如何执行此操作)


Foa*_*oad 3

根据Wenzel Jakob回答,我想举一个编译本教程CMakeLists.txt中提供的示例的示例:

// example.cpp

#include <pybind11/pybind11.h>

int add(int i, int j) {
    return i + j;
}

PYBIND11_MODULE(example, m) {
    m.doc() = "pybind11 example plugin"; // optional module docstring

    m.def("add", &add, "A function which adds two numbers");
}
Run Code Online (Sandbox Code Playgroud)

# example.py

import example

print(example.add(1, 2))
Run Code Online (Sandbox Code Playgroud)

# CMakeLists.txt

cmake_minimum_required(VERSION 2.8.12)
project(example)

find_package(pybind11 REQUIRED)
pybind11_add_module(example example.cpp)
Run Code Online (Sandbox Code Playgroud)

现在在 root 运行中

# CMakeLists.txt

cmake_minimum_required(VERSION 2.8.12)
project(example)

find_package(pybind11 REQUIRED)
pybind11_add_module(example example.cpp)
Run Code Online (Sandbox Code Playgroud)

现在运行 python 代码

python3 example.py
Run Code Online (Sandbox Code Playgroud)

PS我还在这里写了一些编译/安装pybind11.