gpt4 book ai didi

c++ - 如何将 pybind11 与 cmake 一起用于链接 2 个模块

转载 作者:太空宇宙 更新时间:2023-11-04 12:48:22 25 4
gpt4 key购买 nike

我正在尝试组合一些由 pybind11 创建的模块,但不幸的是无法让它工作。希望有人能帮忙。我已尝试尽可能简化问题。

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

  • :可以直接调用
  • line:可以直接调用,也可以使用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

点.cpp:

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

行.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

行.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)

导致 undefined symbol 错误:未找到符号:__ZN5pointC1Eddd

更新:

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

更新:更精确的错误:

最佳答案

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

例如

class PYBIND11_EXPORT Point {
...
}

关于c++ - 如何将 pybind11 与 cmake 一起用于链接 2 个模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50257655/

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