V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
scholarOfSin
V2EX  ›  问与答

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

  •  
  •   scholarOfSin · 2019-07-25 16:11:35 +08:00 · 1505 次点击
    这是一个创建于 1729 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    试想过的思路有:

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

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

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

    这种问题却是不好解决,可能我知识量太少,但是我知道的有这种带 C 发布的没一个好办的 - 有个包叫 pycrypto,那阵子安装真的是头痛死了。
    coderluan
        5
    coderluan  
       2019-07-25 16:29:20 +08:00
    Windows 等平台时函数名会混淆? 具体是指什么,我感觉这个是可以解决的。
    scholarOfSin
        6
    scholarOfSin  
    OP
       2019-07-25 16:32:14 +08:00
    coderluan
        7
    coderluan  
       2019-07-25 16:37:03 +08:00
    @scholarOfSin 我看那个回答下面常见的可能性都提到了,你都试了还是解决不了?
    scholarOfSin
        8
    scholarOfSin  
    OP
       2019-07-25 16:59:40 +08:00
    @coderluan 用到的函数前加上里面提到的语句就能解决了,所以才能够用 ctypes 调用成功。但是这部分代码只能在 VS 下使用,GCC 编译不通过,问题就来了
    coderluan
        9
    coderluan  
       2019-07-25 17:19:35 +08:00   ❤️ 1
    @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
        10
    scholarOfSin  
    OP
       2019-07-25 17:21:56 +08:00
    @coderluan 受教了,我去试试。
    eastlhu
        11
    eastlhu  
       2019-07-26 09:10:46 +08:00
    swig
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1256 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 23:29 · PVG 07:29 · LAX 16:29 · JFK 19:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.