【问题标题】:How should I call a function from .so using python ctypes.CDLL?我应该如何使用 python ctypes.CDLL 从 .so 调用函数?
【发布时间】:2021-05-16 12:17:30
【问题描述】:

我正在尝试在我的 python 项目中运行 C++ 代码。 这是recompile.sh,它很好地构建了共享对象。

g++ -fPIC -shared -I /home/pathto python/python3.8/ src/example.hpp \
  /usr/lib/x86_64-linux-gnu/libboost_python38.so -o src/example.so

example.hpp:

#include <boost/python.hpp>

int get_answer_c(){
  return 42;
}

BOOST_PYTHON_MODULE(example){
  boost::python::def("get_answer", get_answer_c);
}

当我尝试导入模块时 example 我收到此错误:

AttributeError: ./src/example.so: undefined symbol: get_answer

【问题讨论】:

  • 如何导入?显示有问题的代码。

标签: python c++ c python-3.x


【解决方案1】:

编辑:

只有当我使用.cpp而不是.hpp时它才能正确编译
(而libboost_python38.sosrc/example.cpp 之后)


我使用这个makefile正确编译了它。

首先编译example.o,然后编译example.so

项目-lboost_python38必须在src/example.o之后


我将代码保留在 .cpp 中,因为 .hpp 似乎是标题。


makefile

src/example.so: src/example.o
    g++ \
    -shared \
    -L/usr/lib/x86_64-linux-gnu/ \
    -o src/example.so \
    src/example.o \
    -lboost_python38

src/example.o:
    g++ \
    -c \
    -fPIC \
    -I/usr/include/python3.8 \
    -o src/example.o \
    src/example.cpp

clean:
    rm src/example.o src/example.so
    

编辑:

我得到正确的模块,即使是

g++ -fPIC -shared -I/usr/include/python3.8 -o src/example.so src/example.cpp /usr/lib/x86_64-linux-gnu/libboost_python38.so

或以不同的顺序

g++ -fPIC -shared -I/usr/include/python3.8 src/example.cpp /usr/lib/x86_64-linux-gnu/libboost_python38.so -o src/example.so

我总是去文件夹src,运行python3.8并运行行

import example

example.get_answer()

【讨论】:

    猜你喜欢
    • 2022-12-03
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    • 2020-06-03
    • 2017-10-23
    • 2021-06-11
    • 2023-04-07
    相关资源
    最近更新 更多