我很清楚允许C代码运行python代码的许多可能性,反之亦然(Cython,Boost.Python,...).但是,除非我弄错了,所有这些方法只是"调用"相关的python脚本并管理C程序和python脚本之间的交互.因此,需要安装python.
在我的情况下,我想要一个独立的解决方案,我的python代码可以以某种方式编译并链接到我的主要C++程序.我对Cython抱有希望,因为它允许我编译我的脚本并创建一个.so文件.但是,我似乎无法将.so文件"链接"到我的C++程序中.我尝试了以下方法:
一个简单的python脚本,包含一个函数multiply(a,b),它返回一个*b; 我使用cython创建了一个libmultiply.so文件.一个简短的Cpp文件,输出乘法(5,2)的结果:
int multiply(int, int);
int main()
{
std::cout << multiply(5,2) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
我通过以下方式构建:g ++ test.cpp -L/home/jerome/-lmultiply
这给了我错误:
test.cpp:(.text+0x2b): undefined reference to `multiply(int, int)'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我不确定我尝试的是否有意义,但希望它能让你了解我想要实现的目标.
在我的 Ubuntu 下:
$猫测试.py
#Filename test.py
def Hello():
print "Hello, world!"
Run Code Online (Sandbox Code Playgroud)
$猫tom.cpp
#include <Python.h>
int main()
{
Py_Initialize();
PyObject * pModule = NULL;
PyObject * pFunc = NULL;
pModule = PyImport_ImportModule("test");
pFunc = PyObject_GetAttrString(pModule, "Hello");
PyEval_CallObject(pFunc, NULL);
Py_Finalize();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然后编译它:
g++ tom.cpp -I/usr/include/python2.7 -L/usr/lib/python2.7 -lpython2.7
Run Code Online (Sandbox Code Playgroud)
运行:$ ./a.out
Segmentation fault
Run Code Online (Sandbox Code Playgroud)
为什么?有人可以帮忙吗?谢谢!
BR,汤姆