【问题标题】:Compile Error while building CPP with Pybind11 for Python in Visual Studio 2017在 Visual Studio 2017 中使用 Pybind11 for Python 构建 CPP 时出现编译错误
【发布时间】:2019-05-27 01:49:21
【问题描述】:

此查询与 Microsoft Docs 中标题为 Create a C++ extension for Python 的教程相关。

我已按照教程完成所有说明。我使用的是 Windows 10 64 位并安装了多个 python 版本,我通常称之为py -x.x-xx sample.py。为此,我安装了带有 Python 开发选项的 Visual Studio 2017,其中包括 Python 3.6 32 位和 64 位。

教程中展示了两种方式:(1) CPython extensions 和 (2) Pybind11。我在他们两个方面都遇到了多个错误。但是,我决定采用 Pybind11 方式,因此列出了与之相关的错误,因为它更简洁,并且只需要对原始 C++ 代码进行很少的更改。

这是module.cpp文件:

#include <pybind11/pybind11.h>
#include <Windows.h>
#include <cmath>

const double e = 2.7182818284590452353602874713527;

double sinh_impl(double x) {
    return (1 - pow(e, (-2 * x))) / (2 * pow(e, -x));
}

double cosh_impl(double x) {
    return (1 + pow(e, (-2 * x))) / (2 * pow(e, -x));
}

double tanh_impl(double x) {
    return sinh_impl(x) / cosh_impl(x);
}

namespace py = pybind11;

PYBIND11_MODULE(superfastcode2, m) {
    m.def("fast_tanh2", &tanh_impl, R"pbdoc(
        Compute a hyperbolic tangent of a single argument expressed in radians.
    )pbdoc");

#ifdef VERSION_INFO
    m.attr("__version__") = VERSION_INFO;
#else
    m.attr("__version__") = "dev";
#endif
}

当我尝试按照教程中的说明进行构建时,日志中生成的错误如下:

  module.cpp
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\buffer_info.h(49): error C2061: syntax error: identifier 'Py_buffer'
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\buffer_info.h(49): error C2535: 'pybind11::buffer_info::buffer_info(void)': member function already defined or declared
  c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\buffer_info.h(26): note: see declaration of 'pybind11::buffer_info::buffer_info'
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\buffer_info.h(87): error C2143: syntax error: missing ';' before '*'
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\buffer_info.h(87): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\buffer_info.h(87): error C2238: unexpected token(s) preceding ';'
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\buffer_info.h(50): error C2065: 'view': undeclared identifier
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\buffer_info.h(51): error C2065: 'view': undeclared identifier
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\buffer_info.h(50): error C2661: 'pybind11::buffer_info::buffer_info': no overloaded function takes 2 arguments
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\buffer_info.h(52): error C2039: 'view': is not a member of 'pybind11::buffer_info'
  c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\buffer_info.h(17): note: see declaration of 'pybind11::buffer_info'
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\buffer_info.h(52): error C2065: 'view': undeclared identifier
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\buffer_info.h(71): error C2065: 'view': undeclared identifier
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\buffer_info.h(71): error C2039: 'view': is not a member of 'pybind11::buffer_info'
  c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\buffer_info.h(17): note: see declaration of 'pybind11::buffer_info'
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\buffer_info.h(77): error C2065: 'view': undeclared identifier
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\buffer_info.h(77): error C3861: 'PyBuffer_Release': identifier not found
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\buffer_info.h(77): error C2541: 'delete': cannot delete objects that are not pointers
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(406): error C3861: 'PyInstanceMethod_Check': identifier not found
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(407): error C3861: 'PyInstanceMethod_GET_FUNCTION': identifier not found
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(410): error C3861: 'PyMethod_Check': identifier not found
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(411): error C3861: 'PyMethod_GET_FUNCTION': identifier not found
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(613): error C2065: 'PyListObject': undeclared identifier
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(613): error C2059: syntax error: ')'
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(613): error C2612: trailing '(' illegal in base/member initializer list
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(678): error C2039: 'sequence_slow_readwrite': is not a member of 'pybind11::detail::iterator_policies'
  c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(595): note: see declaration of 'pybind11::detail::iterator_policies'
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(678): error C2065: 'sequence_slow_readwrite': undeclared identifier
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(678): error C2923: 'pybind11::detail::generic_iterator': 'sequence_slow_readwrite' is not a valid template type argument for parameter 'Policy'
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(679): error C2039: 'dict_readonly': is not a member of 'pybind11::detail::iterator_policies'
  c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(595): note: see declaration of 'pybind11::detail::iterator_policies'
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(679): error C2065: 'dict_readonly': undeclared identifier
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(679): error C2923: 'pybind11::detail::generic_iterator': 'dict_readonly' is not a valid template type argument for parameter 'Policy'
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(779): error C2027: use of undefined type '_typeobject'
  c:\program files (x86)\microsoft visual studio\shared\python36_86\include\object.h(344): note: see declaration of '_typeobject'
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(779): error C2065: '_PyObject_NextNotImplemented': undeclared identifier
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(832): error C2039: 'PyIterable_Check': is not a member of 'pybind11::detail'
  c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(402): note: see declaration of 'pybind11::detail'
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(832): error C3861: 'PyIterable_Check': identifier not found
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(839): error C2039: 'PyUnicode_Check_Permissive': is not a member of 'pybind11::detail'
  c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(402): note: see declaration of 'pybind11::detail'
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(839): error C3861: 'PyUnicode_Check_Permissive': identifier not found
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(934): error C2440: 'initializing': cannot convert from 'const pybind11::str' to 'pybind11::object'
  c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(934): note: No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(935): error C2027: use of undefined type 'pybind11::str'
  c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(21): note: see declaration of 'pybind11::str'
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(936): error C2027: use of undefined type 'pybind11::str'
  c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(21): note: see declaration of 'pybind11::str'
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(963): error C2039: 'PyNone_Check': is not a member of 'pybind11::detail'
  c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(402): note: see declaration of 'pybind11::detail'
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(963): error C3861: 'PyNone_Check': identifier not found
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(1012): error C2039: 'enable_if_t': is not a member of 'pybind11::detail::detail'
  c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(984): note: see declaration of 'pybind11::detail::detail'
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(1012): error C2947: expecting '>' to terminate template-parameter-list, found '<'
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(1012): warning C4346: 'value': dependent name is not a type
  c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(1012): note: prefix with 'typename' to indicate a type
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(1012): error C2061: syntax error: identifier 'value'
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(1013): error C2334: unexpected token(s) preceding '{'; skipping apparent function body
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(1029): error C2039: 'enable_if_t': is not a member of 'pybind11::detail::detail'
  c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(984): note: see declaration of 'pybind11::detail::detail'
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(1029): error C2947: expecting '>' to terminate template-parameter-list, found '<'
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(1029): warning C4346: 'value': dependent name is not a type
  c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(1029): note: prefix with 'typename' to indicate a type
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(1029): error C2061: syntax error: identifier 'value'
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(1030): error C2334: unexpected token(s) preceding '{'; skipping apparent function body
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(1301): error C2244: 'pybind11::detail::object_api<Derived>::begin': unable to match function definition to an existing declaration
  c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(1301): note: see declaration of 'pybind11::detail::object_api<Derived>::begin'
  c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(1301): note: definition
  c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(1301): note: 'pybind11::detail::iterator pybind11::detail::object_api<Derived>::begin(void) const'
  c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(1301): note: existing declarations
  c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(1301): note: 'pybind11::iterator pybind11::detail::object_api<Derived>::begin(void) const'
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(1302): error C2244: 'pybind11::detail::object_api<Derived>::end': unable to match function definition to an existing declaration
  c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(1302): note: see declaration of 'pybind11::detail::object_api<Derived>::end'
  c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(1302): note: definition
  c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(1302): note: 'pybind11::detail::iterator pybind11::detail::object_api<Derived>::end(void) const'
  c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(1302): note: existing declarations
  c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(1302): note: 'pybind11::iterator pybind11::detail::object_api<Derived>::end(void) const'
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(1303): error C2888: 'pybind11::detail::item_accessor pybind11::detail::object_api<Derived>::operator [](pybind11::handle) const': symbol cannot be defined within namespace 'detail'
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(1306): error C2988: unrecognizable template declaration/definition
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(1306): error C2059: syntax error: 'const'
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(1306): error C2143: syntax error: missing ';' before '{'
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(1306): error C2447: '{': missing function header (old-style formal list?)
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(1309): error C2888: 'pybind11::detail::obj_attr_accessor pybind11::detail::object_api<Derived>::attr(pybind11::handle) const': symbol cannot be defined within namespace 'detail'
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(1312): error C2988: unrecognizable template declaration/definition
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(1312): error C2059: syntax error: 'const'
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(1312): error C2143: syntax error: missing ';' before '{'
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(1312): error C2447: '{': missing function header (old-style formal list?)
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(1315): error C2888: 'pybind11::detail::args_proxy pybind11::detail::object_api<Derived>::operator *(void) const': symbol cannot be defined within namespace 'detail'
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(1317): error C2027: use of undefined type 'pybind11::detail::args_proxy'
  c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(25): note: see declaration of 'pybind11::detail::args_proxy'
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(1318): error C2888: 'bool pybind11::detail::object_api<Derived>::contains(T &&) const': symbol cannot be defined within namespace 'detail'
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(1323): error C2888: 'pybind11::str pybind11::detail::object_api<Derived>::str(void) const': symbol cannot be defined within namespace 'detail'
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(1323): error C2027: use of undefined type 'pybind11::str'
  c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(21): note: see declaration of 'pybind11::str'
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(1326): error C2888: 'pybind11::detail::str_attr_accessor pybind11::detail::object_api<Derived>::doc(void) const': symbol cannot be defined within namespace 'detail'
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\pytypes.h(1329): error C2888: 'pybind11::handle pybind11::detail::object_api<Derived>::get_type(void) const': symbol cannot be defined within namespace 'detail'
c:\program files (x86)\microsoft visual studio\shared\python36_86\include\pybind11\detail\typeid.h(22): fatal error C1903: unable to recover from previous error(s); stopping compilation

【问题讨论】:

  • 所有的包含路径都设置正确了吗?
  • 是的。我通过删除#include 来检查它。然后它给出一个错误,说找不到头文件。所以我确定它正在读取头文件。错误一旦进入它就会开始。即使只有 #include 而没有其他特定于 pybind11 的其他代码,它也会产生许多错误。
  • 那你为什么要发布一个不仅仅是#include的代码示例?请提供minimal reproducible example 错误,因为文本不在图片中或链接后面
  • 您正在删除标头,然后通过告诉您找不到文件而失败?显然它仍然是从某个地方包含的,并且由于项目设置不正确而无法找到。在include路径中添加pybind11的路径。
  • 我认为您误解了我的评论。 :-) 我已经包含了包含文件夹的路径: C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_86\include 。尽管包含此路径,但我收到上述错误。

标签: python c++ visual-studio windows-10 pybind11


【解决方案1】:

我遇到了完全相同的问题。经过一番折腾,我在github上下载了与教程相关的存储库:https://github.com/Microsoft/python-sample-vs-cpp-extension,并逐行通过项目配置。 (顺便说一下,他们的配置使用环境变量 PYTHONPATH 而不是 PYTHONHOME,如教程中所述。)

对我来说解决问题的是将预处理器定义更改为: _WINDLL;%(预处理器定义) 以匹配存储库版本。罪魁祸首似乎是教程建议的 Py_LIMITED_API 定义:当我将其添加到列表中时,问题又回来了。

【讨论】:

  • 感谢您的解决方案。让我试试这个,我会回复你的反馈并支持你的答案。
  • 谢谢!简单地删除 Py_LIMITED_API 也适用于我(使用手册推荐的 Python 3.7 32 位)。
【解决方案2】:

正如我所见,您正在尝试使用 32 位 Python 编译示例,但它无法在 Python 安装中编译 pybind11。

默认情况下,我的 VS2017 单独安装了 64 位 Python。 所以我已经为这样的 64 位配置了示例。

在 superfastcode2 中转到:

C/C++ / 常规 / 附加包含目录 - 添加 $(PythonHome)Include$(ProjectDir)pybind11-master,最新的一定要指向pybind11的安装位置(从GitHub下载为ZIP文件,解压到pybind11-master目录,我在superfastcode2文件夹下)。 链接器/常规 - 添加$(PythonHome)libs

在 superfastcode 中转到:

C/C++ / 常规 / 附加包含目录 - 添加

C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\include

链接器/常规 - 添加

C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\libs

在 module.cpp 中为 Python.h 添加此解决方法:

//Workaround for - LNK1104: cannot open file 'python36_d.lib'

#define HAVE_RND  //This makes always use the Release version of Python, even in Debug mode

#ifdef _DEBUG
#define RESTORE_DEBUG
#undef _DEBUG
#endif

#include <Python.h>

#ifdef RESTORE_DEBUG
#define _DEBUG
#undef RESTORE_DEBUG
#endif

修复路径:

#include <include/pybind11/pybind11.h>

那么应该可以了。 ;)

【讨论】:

    【解决方案3】:

    同样的问题!最后,我在安装 64 位版本 Python 时将 [配置 > 平台] 更改为 x64 来修复它。

    与目标架构相关的链接器错误:更改 C++ 目标的项目架构以匹配 Python 安装的架构。例如,如果您使用 C++ 项目以 x64 为目标,但您的 Python 安装是 x86,请将 C++ 项目更改为以 x86 为目标。

    【讨论】:

      猜你喜欢
      • 2018-08-17
      • 1970-01-01
      • 1970-01-01
      • 2021-02-04
      • 1970-01-01
      • 2018-07-11
      • 2018-12-08
      • 2017-08-28
      • 1970-01-01
      相关资源
      最近更新 更多