【发布时间】: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怎么样?抱歉所有问题,我仍在尝试重现它...