首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用pybind11构建cpp

用pybind11构建cpp
EN

Stack Overflow用户
提问于 2020-05-13 02:06:36
回答 2查看 2K关注 0票数 2

我刚接触pybind (还有C++)。我正在尝试遵循有关pybind https://pybind11.readthedocs.io/en/stable/basics.html的教程,但在构建它时遇到了问题。我在桌面上有一个文件夹,里面有这样的结构:

代码语言:javascript
复制
.
├── file.txt
├── include
│   └── pybind11
│       ├── attr.h
│       ├── buffer_info.h
│       ├── cast.h
│       ├── chrono.h
│       ├── common.h
│       ├── complex.h
│       ├── detail
│       │   ├── class.h   
│       │   ├── common.h
│       │   ├── descr.h
│       │   ├── init.h
│       │   ├── internals.h
│       │   └── typeid.h
│       ├── eigen.h
│       ├── embed.h
│       ├── eval.h
│       ├── functional.h
│       ├── iostream.h
│       ├── numpy.h
│       ├── operators.h
│       ├── options.h
│       ├── pybind11.h
│       ├── pytypes.h
│       ├── stl_bind.h
│       └── stl.h
├── prova.cpp
└── share
    └── cmake
        └── pybind11
            ├── FindPythonLibsNew.cmake
            ├── pybind11Config.cmake
            ├── pybind11ConfigVersion.cmake
            ├── pybind11Targets.cmake
            └── pybind11Tools.cmake

6 directories, 31 files

我的文件prova.cpp如下:

代码语言:javascript
复制
#include <pybind11/pybind11.h>

namespace py = pybind11;

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

PYBIND11_MODULE(prova, m) {
    m.def("add", &add, "A function which add two numbers");
}

现在,在教程中,他们说要使用以下命令构建文件:

代码语言:javascript
复制
c++ -O3 -Wall -shared -std=c++11 -fPIC `python3 -m pybind11 --includes` example.cpp -o example`python3-config --extension-suffix`

但是我得到了下面的输出:

代码语言:javascript
复制
c++: error: python3 -m pybind11 --includes: No such file or directory

现在,我已经通过conda安装了python,并且我有了一个包含所有需要的包的环境。如果我在命令提示符下运行命令python3 -m pybind11 --includes,我会得到以下输出:

代码语言:javascript
复制
-I/home/luca/Programs/miniconda3/envs/fcg/include/python3.7m -I/home/luca/Programs/miniconda3/envs/fcg/lib/python3.7/site-packages/pybind11/include

显然,我必须在正确的conda环境中。所以我担心c++是否无法使用正确的conda环境。但是,即使我替换了直接在c++命令中获得的输出,也可以运行:

代码语言:javascript
复制
c++ -O3 -Wall -shared -std=c++11 -fPIC '-I/home/luca/Programs/miniconda3/envs/fcg/include/python3.7m -I/home/luca/Programs/miniconda3/envs/fcg/lib/python3.7/site-packages/pybind11/include' prova.cpp -o prova'python3-config --extension-suffix'

我得到了另一个输出:

代码语言:javascript
复制
prova.cpp:1:10: fatal error: pybind11/pybind11.h: No such file or directory
#include <pybind11/pybind11.h>
      ^~~~~~~~~~~~~~~~~~~~~
compilation terminated.

我真的不知道该怎么解决它。感谢那些能提供帮助的人:)

EN

回答 2

Stack Overflow用户

发布于 2020-05-13 02:16:38

您需要在c++行的前面包含“包含pybind11.h文件的文件夹pybind11的路径”。

-I“路径”告诉编译器在哪里可以找到头文件。

票数 0
EN

Stack Overflow用户

发布于 2021-12-13 22:20:54

步骤1:查找pybuild11包含文件的位置:

代码语言:javascript
复制
$ python3.8 -c "import pybind11;print(pybind11.get_include())"
/usr/local/lib/python3.8/site-packages/pybind11/include

第2步:将路径添加到includes以编译命令:

代码语言:javascript
复制
$ c++ ...[bunch of stuff]... -I '/usr/local/lib/python3.8/site-packages/pybind11/include'  ...[bunch of stuff]...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61758906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档