我有一个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
似乎有效。非常感谢
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
文件表示位置独立代码的标志,允许正确执行,无论其绝对地址如何:相关问题 更多 >
编程相关推荐