【问题标题】:Python call boost .so file Library not loaded ErrorPython 调用 boost .so 文件库未加载错误
【发布时间】:2020-07-23 01:55:10
【问题描述】:

我有一个 cpp 项目,我使用 boot 创建一个 python 接口来调用 python3 的 C++ 函数。我无法用 python 导入它。如果项目格式是:

-project:
    |_ CppProj:
        |_ __init__.py
        |_ Makefile
        |_ cppFunctions.hpp
        |_ cppFunctions.cpp
        |_ cppFunctions.so
        |_ cppFunctions.o
        |_ PythonCallCppInside.py
    
    |_ pythonCallCppOutside.py

我将 __init__.py 添加到 cpp 目录,以便我可以从 python 引用该目录,但我不确定这是否是正确的方法。

PythonCallCppInside.py 很简单:

import cppFunctions

而pythonCallCppOutside.py是:

from .CppProj import cppFunctions

PythonCallCppInside 可以做导入等等(例如,调用函数,传输数据,...)。但是,pythonCallCppOutside.py 给了我以下错误:

ImportError: dlopen(/path/CppProj/cppFunctions.so, 2): Library not loaded: cppFunctions.o
Referenced from: /path/CppProj/cppFunctions.so
Reason: image not found

我已尝试添加:

import sys
sys.path.append('CppProj')

但这也没有用。与上述相同的错误。

我不确定为什么会发生这个错误,这可能是一个非常愚蠢的错误,但我需要能够从目录外部调用这个 .so 文件,但我目前不能。

感谢任何帮助。

更新:感谢jackw11111,在make文件的形成中找到了解决办法。

cppFunction.so: cppFunction.o

    $(CXX) $(CFLAGS) cppFunction.o -shared -o cppFunction.so -L$(BOOST_LIB) -$(BOOST) -L$(LIBPYTHON_PATH) -lpython$(PYTHON_VERSION_FINAL)
cppFunction.o: cppFunction.cpp

    $(CXX) $(CFLAGS) -c cppFunction.cpp -fPIC  -I$(PYTHON_INCLUDE) -I$(BOOST_INC) -L$(BOOST_LIB) -$(BOOST) -L$(LIBPYTHON_PATH) -lpython$(PYTHON_VERSION_FINAL) -o cppFunction.o

似乎有效。非常感谢。

【问题讨论】:

  • 如果您在CppProj 中使用cd 并使用python 运行iPython,然后使用import cppFunctions 导入它是否没有错误?您是否尝试过使用sys.path.append() 的绝对路径?另外,您使用什么命令将您的 c++ 文件编译为 .so?
  • 是的,当我 cd 进入并在 CppProj 中运行 python 文件时,它运行良好。
  • 绝对路径呢?
  • 是的,当我 cd 进入并在 CppProj 中运行 python 文件时,它运行良好。使用带有 sys.path.append() 的绝对路径不起作用。这些是我使用的标志: -lm -pthread -O3 -std=c++11 -march=native -Wall -funroll-loops -Wno-unused-result 我还有我的boost和python库来制作.o然后是 .so 文件。抱歉,最后一条评论没有正确保存。我的错。
  • from CppProj import cppFunctions 怎么样?抱歉所有问题,我仍在尝试重现它...

标签: python c++ boost


【解决方案1】:

import 语句调用dlopen() 使用其绝对路径(dlopen(/path/CppProj/cppFunctions.so, 2),它工作正常。看起来您正在尝试加载一个加载另一个库(cppFunctions.o),因此您失去了指定的控制权库以其绝对路径所在的位置.它正在搜索cppFunctions.o而不是/path/CppProj/cppFunctions.o,这就是它找不到它的原因,因为在您调用python脚本的文件夹中没有cppFunctions.o。因此,您需要将 .o 文件移动到您调用 python 脚本的目录中,或者您需要从 .o 文件在文件树中的位置调用您的 python 脚本。

另一个选择是消除 .so 文件对 .o 文件的依赖,这应该可以解决问题。

.o 文件不应该有 .so 文件的依赖项,除非在创建它之后,它不应该需要它,所以我不确定那里发生了什么(你是在构建 .o 文件吗?所以用-fPIC?)归档。所以你应该确保你编译 .o 文件时带有 -fPIC 标志,它代表位置无关代码,并且无论其绝对地址如何都允许正确执行:

g++ cppFunctions.cpp -c -fPIC ... -o cppFunctions.o

g++ cppFunctions.o ... -shared -o cppFunctions.so -lpython -lboost_python ...

【讨论】:

  • 这似乎成功了。我曾经有-fPIC,但我没有-c,而且-shared 也放错了地方。 1:在 .o 的制作中添加了 -c 2:在 .so 的制作中添加了 -shared 而不是 .o 这些似乎已经成功了。我将添加同样适用的 make 文件行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-14
  • 1970-01-01
  • 2018-05-10
相关资源
最近更新 更多