首页 > 解决方案 > 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

似乎工作。非常感谢。

标签: pythonc++boost

解决方案


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

推荐阅读