Python调用boost.so文件库未加载错误

2024-06-16 11:23:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个CPP项目,我使用引导创建一个Python接口,用Python 3调用C++函数。我在用python导入时遇到了问题。如果项目格式为:

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

我将_uinit_uuu.py添加到cpp目录中,以便从python中引用该目录,但我不确定这样做是否正确

pythoncallcppinder.py是一个简单的:

import cppFunctions

pythoncallcppouther.py是:

from .CppProj import cppFunctions

pythoncallcppinder可以执行导入和其他操作(即调用函数、传输数据等)。但是,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,在生成文件的过程中找到了解决方案

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

似乎有效。非常感谢


Tags: path项目frompyimport目录so错误
1条回答
网友
1楼 · 发布于 2024-06-16 11:23:22

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

另一种选择是消除.so文件对.o文件的依赖性,这将解决问题

除了在创建.o文件时,它不应该与.so文件有依赖关系,之后它不应该需要它,因此我不确定那里发生了什么(是否使用-fPIC构建.so文件)。因此,您应该确保使用-fPIC编译.o文件表示位置独立代码的标志,允许正确执行,无论其绝对地址如何:

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

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

相关问题 更多 >