簡體   English   中英

在 Pybind11 中使用自動轉換

[英]Using automatic conversion in Pybind11

我試圖通過從 Python 調用它們來利用一些 C++ 函數。 為此,我試圖構建一個小的演示函數來向自己展示如何將 python 類型轉換為 C++ 類型。 根據 Pybind11 文檔,如果您在標頭中包含pybind11/stl.h ,則應為許多常見類型進行自動轉換:

https://pybind11.readthedocs.io/en/stable/advanced/cast/stl.html

以下代碼有什么問題?

我的.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;
    }

包裹.cpp

#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
}

我已經成功編譯了我構建的其他演示,所以我認為這不是我編譯過程中的錯誤。 但是編譯這個演示我得到這個錯誤:

 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

問題很簡單:標頭保護不適用於 .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);

你的函數的聲明。

my.cpp應該包含定義:

#include "my.h"
int add_these(std::vector<int> const&v) {
  int sum=0;
  for (int i = 0; i < v.size(); ++i) {
      sum += v[i];
  }
  return sum;
}

您看到的錯誤是您有兩個包含函數定義的.cpp文件; 這在 C++ 中是不允許的。

#include "my.cpp"復制粘貼的內容my.cpp ,其中包括指令是。 這與 python 中的 import 不同。

在其他情況下沒有發生這種情況,可能是因為您沒有鏈接 cpp 文件; 不管包含 cpp 文件是否違反約定,都不要這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM