Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编译python代码并将其链接到C++;节目?_Python_C++ - Fatal编程技术网

编译python代码并将其链接到C++;节目?

编译python代码并将其链接到C++;节目?,python,c++,Python,C++,我很清楚存在许多允许C代码运行python代码的可能性,反之亦然(Cython、Boost.python,…)。但是,除非我弄错了,否则所有这些方法都只是“调用”相关的python脚本并管理C程序和python脚本之间的交互。因此,需要安装python 在我的情况下,我想一个独立的解决方案,我的Python代码可以以某种方式编译并链接到我的主要C++程序。我对Cython抱有希望,因为它允许我编译脚本并创建一个.so文件。但是,我似乎并没有“链接”,所以我的C++程序文件。我尝试了以下几点: 一

我很清楚存在许多允许C代码运行python代码的可能性,反之亦然(Cython、Boost.python,…)。但是,除非我弄错了,否则所有这些方法都只是“调用”相关的python脚本并管理C程序和python脚本之间的交互。因此,需要安装python

在我的情况下,我想一个独立的解决方案,我的Python代码可以以某种方式编译并链接到我的主要C++程序。我对Cython抱有希望,因为它允许我编译脚本并创建一个.so文件。但是,我似乎并没有“链接”,所以我的C++程序文件。我尝试了以下几点:

一个简单的python脚本,包含一个返回A*b的函数multiply(A,b);我使用cython创建了一个libmultiply.so文件。 输出乘法(5,2)结果的短Cpp文件:

我不确定我的尝试是否有意义,但希望它能让你了解我想要实现的目标。

是我能找到的最接近的东西。它将Python的类型化子集编译成C++。可能没有您希望的那么健壮,但这是一个奇怪的用例。如果你想自己写一些东西,你可以看看哪些东西被用来创造类似于你想要的东西

编辑1:


我刚刚在github上找到了这个很棒的python东西列表,它链接到了一个python LLVM实现。可以更好地适合你想要的东西或者Python到C++桥的起点。它输出链接到Python/CAPI的代码。除非那个API可用,否则用Cython构建的任何东西都不会起作用。它还(AFAIK)进行了一些相当激进的名称篡改;它通过虚拟机工作。但是,您可以使用类似“”的方法“冻结”它(它可以创建DLL/SOs)。这就是你想做的吗?或者也许“”会有帮助。@snotwaffle您可以编译它。你必须编写编译器:(因为我不知道一个是容易获得的)。你应该知道,当你写代码> DEF乘(a,b):在Python中返回一个*b<代码>时,C++中的相应函数不是<代码> int乘(int a,int b);<代码>,但更像是
boost::any乘法(boost::any a,boost::any b)。当然,除了它对boost::any一无所知之外;实际函数的签名类似于
PyObject*multiply(PyObject*,PyObject*)。一旦您获得了对
PyObject
的所有支持,您还可以链接到
python.dll`.@JamesKanze是的,当然,您是对的,但如果您提出问题,那就需要使用大锤来敲打图钉了。
int multiply(int, int);

int main()
{
    std::cout << multiply(5,2) << std::endl;
}
test.cpp:(.text+0x2b): undefined reference to `multiply(int, int)'
collect2: error: ld returned 1 exit status