scholarOfSin
V2EX  ›  问与答

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

  •  
  •   scholarOfSin · Jul 25, 2019 · 2313 views
    This topic created in 2511 days ago, the information mentioned may be changed or developed.

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

    试想过的思路有:

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

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

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

    这种问题却是不好解决,可能我知识量太少,但是我知道的有这种带 C 发布的没一个好办的 - 有个包叫 pycrypto,那阵子安装真的是头痛死了。
    coderluan
        5
    coderluan  
       Jul 25, 2019
    Windows 等平台时函数名会混淆? 具体是指什么,我感觉这个是可以解决的。
    scholarOfSin
        6
    scholarOfSin  
    OP
       Jul 25, 2019
    coderluan
        7
    coderluan  
       Jul 25, 2019
    @scholarOfSin 我看那个回答下面常见的可能性都提到了,你都试了还是解决不了?
    scholarOfSin
        8
    scholarOfSin  
    OP
       Jul 25, 2019
    @coderluan 用到的函数前加上里面提到的语句就能解决了,所以才能够用 ctypes 调用成功。但是这部分代码只能在 VS 下使用,GCC 编译不通过,问题就来了
    coderluan
        9
    coderluan  
       Jul 25, 2019   ❤️ 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
       Jul 25, 2019
    @coderluan 受教了,我去试试。
    eastlhu
        11
    eastlhu  
       Jul 26, 2019
    swig
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3327 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 12:45 · PVG 20:45 · LAX 05:45 · JFK 08:45
    ♥ Do have faith in what you're doing.