gpt4 book ai didi

c++ - Pybind11 - 将 PYBIND11_MODULE 放在哪里

转载 作者:行者123 更新时间:2023-11-28 04:41:51 25 4
gpt4 key购买 nike

我目前正在玩弄 pybind11。我正在尝试创建一个 C++ 类,然后将该类传递给嵌入在我的 C++ 源代码中的 python 解释器。

我创建了一些虚拟类只是为了测试我将所有内容都保存在一个源文件中的基本功能。这种方法编译和运行没有任何问题。

现在我将虚拟类 Test 分成 Test.h 和 Test.cpp

测试.h

#pragma once
#include<iostream>
#include"pybind11\pybind11.h"

namespace py = pybind11;

class Test
{
public:
Test(const std::string &s);
~Test();

void printStr();

private:
std::string _s;
};

测试.cpp

#include "Test.h"

PYBIND11_MODULE(TestModule, m)
{
py::class_<Test>(m, "Test")
.def(py::init<const std::string &>())
.def("printStr", &Test::printStr);
}


Test::Test(const std::string &s) : _s(s)
{

}
Test::~Test()
{

}

void Test::printStr()
{
std::cout << "---> " << _s << std::endl;
}

main.cpp

#include"Test.h"

int main(int argc, char **argv)
{

PyImport_AppendInittab("TestModule", PyInit_TestModule);
Py_Initialize();

PyRun_SimpleString("import TestModule");
PyRun_SimpleString("t = TestModule.Test(\"str\")");
PyRun_SimpleString("t.printStr()");
Py_Finalize();

getchar();

return 1;
}

将类 Test 放入新文件后,编译器无法再找到 PyInit_TestModule(main.cpp 行:6),因为它是由 生成的PYBIND11_MODULE 位于 Test.cpp 文件中的宏(MSVS2017 错误:C2065)。

我尝试将 PYBIND11_MODULE 宏放入 Test.h。然而,这导致了一个链接器错误,表明“_PyInit_TestModule”已经在 main.obj 中定义(MSVS2017 错误:LNK2005)

PYBIND11_MODULE 宏放入 main.cpp 文件中即可。但是,我觉得一旦您将大量自定义模块定义放入 main.cpp 中,或者更糟糕的是,您从不同的源文件启动了多个 Python-Interpreter,那么这将变得非常不可读需要在所有这些文件中放置相同的定义,这将是一团糟,很可能会变成链接器错误。

你们中有人遇到过同样的问题吗?你们是如何解决的?

最佳答案

我为绑定(bind)创建了一个他自己的文件,并将其与原始 c++ 文件编译/链接在一起。这样:

1) Test.h + Test.cpp只包含你的类的 C++ 代码

2) Test-bindings.cpp包含 PYBIND11_MODULE 和 #include <Test.h>

3) 构建(使用 cmake)。您将从中获得一个 PyTest.so 文件,您可以在 python 中加载该文件。

# c++ libray
add_library(TestLib SHARED /path/to/Test.h /path/to/Test.cpp)

# bindings
add_subdirectory(pybind11) # you must have downloaded this repo
include_directories(/path-only/to/Test.h)
pybind11_add_module(PyTest SHARED /path/to/Test-bindings.cpp /path/to/Test.cpp)

4)(我建议你)使用你刚刚创建的 python 绑定(bind)在 python 中编写 main

5) 在你的 ma​​in.py

 import PyTest
# do something

关于c++ - Pybind11 - 将 PYBIND11_MODULE 放在哪里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50028830/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com