Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Pybind11中使用自动转换 我试图利用Python调用一些C++函数。为此,我试图构造一个小演示函数来展示自己如何将Python类型转换为C++类型。根据Pybind11文档,如果在标题中包含Pybind11/stl.h,则应自动转换许多常见类型:_C++_Python 3.x_C++17_Pybind11 - Fatal编程技术网

在Pybind11中使用自动转换 我试图利用Python调用一些C++函数。为此,我试图构造一个小演示函数来展示自己如何将Python类型转换为C++类型。根据Pybind11文档,如果在标题中包含Pybind11/stl.h,则应自动转换许多常见类型:

在Pybind11中使用自动转换 我试图利用Python调用一些C++函数。为此,我试图构造一个小演示函数来展示自己如何将Python类型转换为C++类型。根据Pybind11文档,如果在标题中包含Pybind11/stl.h,则应自动转换许多常见类型:,c++,python-3.x,c++17,pybind11,C++,Python 3.x,C++17,Pybind11,以下代码有什么问题 my.cpp #include <vector> int add_these(std::vector<int> &v) { int sum=0; for (int i = 0; i < v.size(); ++i) { sum += v[i]; } return sum; } #include <pybind11/pybind11.h> #include <

以下代码有什么问题

my.cpp

#include <vector>
int add_these(std::vector<int> &v) {
    int sum=0;
    for (int i = 0; i < v.size(); ++i) {
            sum += v[i];
    }
    return sum;
    }
#include <pybind11/pybind11.h>
#include <pybind11/stl.h>
#include <vector>
#include "my.cpp"
namespace py=pybind11;
PYBIND11_MODULE(python_example, m) {
    m.def("addup", &add_these);
#ifdef VERSION_INFO
    m.attr("__version__") = VERSION_INFO;
#else
    m.attr("__version__") = "dev";
#endif
}
#包括
int加上这些(std::vector&v){
整数和=0;
对于(int i=0;i
wrap.cpp

#include <vector>
int add_these(std::vector<int> &v) {
    int sum=0;
    for (int i = 0; i < v.size(); ++i) {
            sum += v[i];
    }
    return sum;
    }
#include <pybind11/pybind11.h>
#include <pybind11/stl.h>
#include <vector>
#include "my.cpp"
namespace py=pybind11;
PYBIND11_MODULE(python_example, m) {
    m.def("addup", &add_these);
#ifdef VERSION_INFO
    m.attr("__version__") = VERSION_INFO;
#else
    m.attr("__version__") = "dev";
#endif
}
#包括
#包括
#包括
#包括“my.cpp”
名称空间py=pybind11;
PYBIND11_模块(python_示例,m){
m、 def(“addup”、&add_这些);
#ifdef版本信息
m、 属性(“版本信息”)=版本信息;
#否则
m、 属性(“\uuuuu版本”=“开发”;
#恩迪夫
}
我已经成功地编译了我构建的其他演示,所以我不认为这是编译过程中的错误。但在编译此演示时,我遇到以下错误:

 wrap.cpp
    creating C:\Users\scottjr1\AppData\Local\Temp\pip-req-build-wyi5ezw1\build\lib.win-amd64-3.7
    C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\bin\HostX86\x64\link.exe /nologo /INCREMENTAL:NO /LTCG /DLL /MANIFEST:EMBED,ID=2 /MANIFESTUAC:NO /LIBPATH:c:\users\scottjr1\appdata\python\python37\libs /LIBPATH:c:\users\scottjr1\appdata\python\python37\PCbuild\amd64 "/LIBPATH:C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\ATLMFC\lib\x64" "/LIBPATH:C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\lib\x64" "/LIBPATH:C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6.1\lib\um\x64" "/LIBPATH:C:\Program Files (x86)\Windows Kits\10\lib\10.0.17763.0\ucrt\x64" "/LIBPATH:C:\Program Files (x86)\Windows Kits\10\lib\10.0.17763.0\um\x64" /EXPORT:PyInit_python_example build\temp.win-amd64-3.7\Release\src/my.obj build\temp.win-amd64-3.7\Release\src/wrap.obj /OUT:build\lib.win-amd64-3.7\python_example.cp37-win_amd64.pyd /IMPLIB:build\temp.win-amd64-3.7\Release\src\python_example.cp37-win_amd64.lib
    wrap.obj : error LNK2005: "int __cdecl add_these(class std::vector<int,class std::allocator<int> > &)" (?add_these@@YAHAEAV?$vector@HV?$allocator@H@std@@@std@@@Z) already defined in my.obj
       Creating library build\temp.win-amd64-3.7\Release\src\python_example.cp37-win_amd64.lib and object build\temp.win-amd64-3.7\Release\src\python_example.cp37-win_amd64.exp
    build\lib.win-amd64-3.7\python_example.cp37-win_amd64.pyd : fatal error LNK1169: one or more multiply defined symbols found
    error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Professional\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\link.exe' failed with exit status 1169
wrap.cpp
创建C:\Users\scottjr1\AppData\Local\Temp\pip-req-build-wyi5ezw1\build\lib.win-amd64-3.7
C:\Program Files(x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\bin\HostX86\x64\link.exe/nologo/INCREMENTAL:NO/LTCG/DLL/MANIFEST:EMBED,ID=2/MANIFESTUAC:NO/LIBPATH:C:\users\scottjr1\appdata\python\python37\libs/LIBPATH:C:\users\scottjr1\appdata\python37\PCbuild\amd64”/LIBPATH:C:\Program程序文件(x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\ATLMFC\lib\x64”“/LIBPATH:C:\Program Files(x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\lib\x64”“/LIBPATH:C:\Program Files(x86)\NETFXSDK\4.6.1\lib\um\x64”“/LIBPATH:C:\Program Files(x86)\Windows Kits\10\lib\10.0.17763.0\ucrt\x64”“/LIBPATH:C:\Program Files(x86)\Windows Kits\10\lib\10.0.17763.0\um\x64”/EXPORT:PyInit\u python\u example build\temp.win-amd64-3.7\Release\temp.win-amd64-3.7\Release\src/wrap.obj/OUT:build\lib.win-amd64-3.7\python\u example.cp37-win\u amd64.pyd/IMPLIB:build\temp.win\temp.win-amd64-3.7\Release\src\src\cpu-amd64\cpu
wrap.obj:错误LNK2005:“int\uu cdecl添加这些(类std::vector&)”(?添加这些@@YAHAEAV$vector@HV?$allocator@H@std@@@std@@@Z)已在my.obj中定义
创建库build\temp.win-amd64-3.7\Release\src\python\u example.cp37-win\u amd64.lib和对象build\temp.win-amd64-3.7\Release\src\python\u example.cp37-win\u amd64.exp
build\lib.win-amd64-3.7\python_example.cp37-win_amd64.pyd:致命错误LNK1169:找到一个或多个乘法定义符号
错误:命令“C:\\Program Files(x86)\\Microsoft Visual Studio\\2017\\Professional\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\link.exe”失败,退出状态为1169

问题很简单:头保护不适用于.cpp文件,因此解决方案是将my.cpp分解为my.hpp和my.cpp文件,并将my.hpp文件包含在wrap.cpp文件中

在我所做的几个演示中,到目前为止,这只是这个演示需要的。我不确定为什么这个演示需要分解文件,但我直接包含.cpp文件的其他演示不需要分解文件。

\include“my.cpp”
是错误的。替换为
\include“my.h”

my.h
应包含:

#include <vector>
int add_these(std::vector<int> const &v);

您看到的错误是,您有两个包含代码定义的<<代码> .CPP < /C>文件;C++中不允许这样做。

#include“my.cpp”
copy将
my.cpp
的内容粘贴到include指令所在的位置。这与python中的导入不同


在其他情况下不会出现这种情况,可能是因为您没有链接cpp文件;无论包含cpp文件是否违反惯例,都不要这样做。

我发现,如果我将my.cpp的内容放在wrap.cpp中,而不编译my.cpp,则演示会按预期工作。即使我向my.cpp添加了标题保护,通常情况下仍然会出错,您应该是否包含
.cpp
文件。另一方面,您可以将
my.cpp
重命名为
my.hpp
并包含它,而无需单独编译。在头文件中包含定义是可以的。