如何最好地将 C++/Cython 项目编译成可执行文件?

Posted

技术标签:

【中文标题】如何最好地将 C++/Cython 项目编译成可执行文件?【英文标题】:How to best compile C++/Cython project into an executable? 【发布时间】:2012-05-27 16:42:59 【问题描述】:

我有一个包含一堆 C++ 和 Python/Cython 文件的项目。到目前为止,我主要开发了 C++ 部分并使用 qmake 将其编译为静态库。一些方法通过 boost::python 公开,并从 .py 文件中执行。

我现在想把整个东西编译成一个独立的可执行文件。

我现在的问题是:最好的方法是什么?我尝试切换到 Cython,编译 python 文件并链接库。但似乎 distutils/setup.py 没有直接的方法来编译可执行文件,只有共享库。

有没有一种方法可以轻松地将 .cpp 和 .pyx 文件同时编译成可执行文件

这样我就可以摆脱许多 boost::python 包装器的东西并获得 c++/python 的巧妙组合,而无需导入共享库并使用 pyinstaller 打包整个东西?

【问题讨论】:

你的应用程序的主要入口点是通过python脚本和C++部分是库吗? 是的,入口点在 Python 中。我用 C++ 编写了所有昂贵的操作(数量很多),并向 Python 中的 C++ 类添加了额外的功能(继承)。主要的“流程”、gui、网络等都是用 Python 编写的。 this question 的答案提供了将 Cython 直接编译为可执行文件的指针。您的情况略有不同,但它可能仍然有用。 @scott-griffiths:谢谢。我已经意识到这一点,但这对我没有多大帮助。我知道 cython 甚至还有一个“-embed”标志,但我无法让它与 distfiles 一起使用,而且我看不出如何用它编译一个大项目。它只是在你编译的单个文件中添加一个 main() 函数。 【参考方案1】:

你应该调查一下:

pyinstaller(或 py2exe)适用于 windows/linux py2app 用于 osx

由于 python 是您的入口点,您将能够将独立的解释器、环境和资源位置捆绑到 app/exe/binary 中。它会将您所有的库模块收集到其独立的站点包中

如果您不使用任何普通的纯 py 文件并且只有 cython 文件,那么也可以将解释器嵌入其中一个文件,作为带有 --embed 标志的 cython 入口点: http://wiki.cython.org/EmbeddingCython 请注意,这是与前面提到的打包选项类似的“冻结”方法,但不会花费额外的时间来构建自包含的环境

【讨论】:

我认为我的问题有点模棱两可:我更喜欢编译(或也可以)python代码的解决方案。 以这种方式打包它不会阻止您编译 cython 和 c++ 扩展并将它们捆绑在一起。你仍然需要一个 python 解释器来启动 py 代码。 @snøreven:是的,也许我错过了关于您的问题的一些内容。您是否正在尝试将您的 cpp+pyx 构建到单个模块中?因为你从你的 cpp+pyx 中说了“可执行”这个词,这让我很困惑。无论如何,您都需要一个解释器来处理您的入口点 py 文件,而将 python 脚本构建成独立可执行文件的唯一方法是通过这种打包方法。 你是对的。我认为有一种方法可以一次直接编译所有内容(cython/python)。正如我所看到的,我必须将 cpp/python 的东西编译为模块,然后从我可以打包的 .py 文件中调用它们?对吗? 是的,这听起来很正确。 py 文件将是入口点。它还意味着支持您的其他 py 包和资源位置的可移植站点包。请参阅我的更新以获取仅 cython 作为条目的另一条路线

以上是关于如何最好地将 C++/Cython 项目编译成可执行文件?的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何构建包含 Cython 代码的 Python 包

编译cython的HelloWorld示例:不知道如何在平台上编译C/C++代码

python编译出1error

01--Java语言概述与开发环境 最适合入门的Java教程

01-Java语言概述与开发环境 最适合入门的Java教程

尝试运行已编译的 Cython 代码时出现“python39.dll not found”错误 [重复]