python - Python 调用 boost .so 文件库未加载错误
问题描述
我有一个 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
似乎工作。非常感谢。
解决方案
dlopen()
import 语句使用其绝对路径调用( dlopen(/path/CppProj/cppFunctions.so, 2)
,它工作正常。看起来您正在尝试加载一个加载另一个 ( cppFunctions.o
) 的库,因此您无法控制使用其绝对路径指定库所在的位置。它正在搜索而cppFunctions.o
不是/path/CppProj/cppFunctions.o
它为什么找不到它,因为cppFunctions.o
您从中调用python脚本的文件夹中没有。因此,您需要将.o文件移动到调用python脚本的目录中,或者您需要从 .o 文件在文件树中的位置调用您的 python 脚本。
另一种选择是消除 .so 文件对 .o 文件的依赖性,这应该可以解决问题。
.o 文件的 .so 文件不应该有依赖关系,除非在创建它之后,它不应该需要它,所以我不确定那里发生了什么(你是用 .so 文件构建的-fPIC
?)。因此,您应该确保使用代表 Position Independent Code.o
的标志编译文件-fPIC
,并且无论其绝对地址如何都允许正确执行:
g++ cppFunctions.cpp -c -fPIC ... -o cppFunctions.o
g++ cppFunctions.o ... -shared -o cppFunctions.so -lpython -lboost_python ...
推荐阅读
- django - 如何在 Django 中使用 POST 方法创建的 GET 方法中查看 API 数据(没有模型)?
- django-models - 在 Django 中动态连接两个模型
- php - 有没有办法从查询字符串中获取值 [product_code]1INSAZE 并使用它来运行 sql 查询
- windows - Chrome 浏览器的 WMI 性能适配器功能?
- typescript - 在 VSCode 中保存文件时仅 lint typescript
- java - 解决显示 javafx.fxml 不存在的错误
- drupal - 如何在 drupal 8 中创建自定义注册和登录表单?
- javascript - LeafletJs 中的 L 定义在哪里?
- node.js - 在 Node JS 中处理“res”
- c++ - 这个套接字选择代码有什么问题?