使用 Python 封装 C++,如何保证跨平台?

2019-07-25 16:11:35 +08:00
 scholarOfSin

有一份跨平台的 C++源码,已经使用 ctypes 实现了对 DLL 的调用。想要将 C++代码和它的 Python 封装一起打包发布到 PyPI,请问各位怎样保证它们的跨平台性?

试想过的思路有:

  1. 对每个平台手动生成 DLL,运行时根据系统信息选择不同的 DLL (已否决,一方面因为平台太多,另一方面因为 DLL 太大)
  2. 打包时包括 C++源码,安装时自动编译源码为库文件(但因为是 C++代码,在如 Windows 等平台时函数名会混淆,不知如何操作)

还请各位 V 友赐教,好人一生平安。

1656 次点击
所在节点    问与答
11 条回复
jimliang
2019-07-25 16:16:33 +08:00
可以考虑把 C++编译成 WebAssembly
scholarOfSin
2019-07-25 16:22:21 +08:00
@jimliang 搜了一下,没明白 Python 怎么调用 WebAssembly ?
Rorysky
2019-07-25 16:23:40 +08:00
@scholarOfSin 一楼也就那么一说
guiqiqi
2019-07-25 16:26:17 +08:00
我一般就是把 C++的兼容性做好,然后把源代码一起和 python 打包发布;
之后在 setup.py 里用 distutils 编译 CPP 部分(这样也要求使用者有合适的编译环境)。

这种问题却是不好解决,可能我知识量太少,但是我知道的有这种带 C 发布的没一个好办的 - 有个包叫 pycrypto,那阵子安装真的是头痛死了。
coderluan
2019-07-25 16:29:20 +08:00
Windows 等平台时函数名会混淆? 具体是指什么,我感觉这个是可以解决的。
scholarOfSin
2019-07-25 16:32:14 +08:00
coderluan
2019-07-25 16:37:03 +08:00
@scholarOfSin 我看那个回答下面常见的可能性都提到了,你都试了还是解决不了?
scholarOfSin
2019-07-25 16:59:40 +08:00
@coderluan 用到的函数前加上里面提到的语句就能解决了,所以才能够用 ctypes 调用成功。但是这部分代码只能在 VS 下使用,GCC 编译不通过,问题就来了
coderluan
2019-07-25 17:19:35 +08:00
@scholarOfSin 你说的是__declspec(dllexport)?这个本来就是 Windows 专有的,给你个跨平台的导出写法,你自己试试吧。

#if defined(_MSC_VER)
// Microsoft
#define EXPORT __declspec(dllexport)
#define IMPORT __declspec(dllimport)
#elif defined(__GNUC__)
// GCC
#define EXPORT __attribute__((visibility("default")))
#define IMPORT
#else
// do nothing and hope for the best?
#define EXPORT
#define IMPORT
#pragma warning Unknown dynamic link import/export semantics.
#endif
scholarOfSin
2019-07-25 17:21:56 +08:00
@coderluan 受教了,我去试试。
eastlhu
2019-07-26 09:10:46 +08:00
swig

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/586173

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX