【问题标题】:how to use pybind11 with cmake for linking 2 modules如何使用 pybind11 和 cmake 链接 2 个模块
【发布时间】:2018-05-09 16:03:15
【问题描述】:

我正在尝试组合由 pybind11 创建的几个模块,但遗憾的是无法使其工作。希望有人可以帮忙。我试图尽可能地简化问题。

我正在尝试创建以下两个模块:

  • point: 可以直接调用
  • line:可以直接调用,也可以使用point模块。

point.h:

#ifndef UNTITLED1_POINT_H
#define UNTITLED1_POINT_H

#include <pybind11/pybind11.h>
#include <pybind11/stl.h>

namespace py = pybind11;

class Point {

private:
    double m_x;
    double m_y;
    double m_z;

public:
    Point()= default;
    Point(double x, double y, double z);
};

PYBIND11_MODULE(point, m) {

    py::class_<Point>(m, "Point")
            .def(py::init<double, double, double>());

}

#endif //UNTITLED1_POINT_H

point.cpp:

#include "point.h"
Point::Point (double x, double y, double z){
    m_x = x;
    m_y = y;
    m_z = z;
}

line.h:

#ifndef UNTITLED1_LINE_H
#define UNTITLED1_LINE_H

#include <pybind11/pybind11.h>
#include <pybind11/stl.h>

namespace py = pybind11;

#include "point.h"

class Line {
private:
    Point m_p1;
    Point m_p2;
public:
    Line(Point p1, Point p2);
};

PYBIND11_MODULE(line, m) {

    py::class_<Line>(m, "line")
            .def(py::init<Point, Point>());

}

#endif //UNTITLED1_LINE_H

line.cpp:

#include "line.h"

Line::Line(Point p1, Point p2) {
    m_p1 = p1;
    m_p2 = p2;
}

CMakeLists.txt:

cmake_minimum_required(VERSION 3.0)
project(untitled1)

set(CMAKE_CXX_STANDARD 11)

add_subdirectory(pybind11)

pybind11_add_module(point point.cpp)
pybind11_add_module(line line.cpp)

现在运行以下python代码:

from point import point
from line import line

p1 = point(1, 2, 3)
p2 = point(3, 4, 5)

l = line(p1, p2)

导致未定义符号错误: Symbol not found: __ZN5pointC1Eddd

更新:

我还在 cmake 文件中尝试了以下几行: pybind11_add_module(point SHARED point.cpp) pybind11_add_module(line line.cpp) target_link_libraries(line PRIVATE point)

更新: 更精确的错误:

【问题讨论】:

  • 您同时提出多个问题。解决方案过程的一部分(以及在 StackOverflow 上询问)是隔离一个问题,进行调查,如果需要,请在此处询问,然后继续。所以我建议你编辑,如果需要,问两个不同的问题。
  • 问题一:symbol not found: __ZN5pointC1Eddd。似乎没有链接成员函数add。嗯...你所提供的不足以判断如何解决这个问题。但可能要么在编译中包含point.cpp,要么只通过制作函数inline来使其成为标题。
  • 问题二:似乎在这里您正在制作两个完全独立于 Python 端的模块。我认为您使用两个不同的CMakeLists.txt 编译它们
  • “你一次问了多个问题。”我试图尽可能地隔离问题,但不知道我正在处理两个不同的问题。当我将模块线和点分开时,一切都按预期工作,只有在引入两个模块之间的依赖关系时才会中断(使用线构造函数中的点)。
  • 很乐意更新/澄清问题,但我真的不知道有什么不清楚的地方。

标签: c++ cmake shared-libraries pybind11


【解决方案1】:

将PYBIND11_EXPORT 宏添加到您想从其他模块中使用的所有类型 (see documentation)。

例如

class PYBIND11_EXPORT Point {
  ...
}

【讨论】:

    猜你喜欢
    • 2019-01-25
    • 2022-12-02
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    • 2013-02-18
    • 2020-11-25
    • 2021-12-15
    • 2019-12-22
    相关资源
    最近更新 更多