使用 Python 封装 C++,如何保证跨平台? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
scholarOfSin

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

  •  
  •   scholarOfSin 2019 年 7 月 25 日 2227 次点击
    这是一个创建于 2466 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有一份跨平台的 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 年 7 月 25 日
    可以考虑把 C++编译成 WebAssembly
    scholarOfSin
        2
    scholarOfSin  
    OP
       2019 年 7 月 25 日
    @jimliang 搜了一下,没明白 Python 怎么调用 WebAssembly ?
    Rorysky
        3
    Rorysky  
       2019 年 7 月 25 日 via iPhone
    @scholarOfSin 一楼也就那么一说
    guiqiqi
        4
    guiqiqi  
       2019 年 7 月 25 日 via iPhone
    我一般就是把 C++的兼容性做好,然后把源代码一起和 python 打包发布;
    之后在 setup.py 里用 distutils 编译 CPP 部分(这样也要求使用者有合适的编译环境)。

    这种问题却是不好解决,可能我知识量太少,但是我知道的有这种带 C 发布的没一个好办的 - 有个包叫 pycrypto,那阵子安装真的是头痛死了。
    coderluan
        5
    coderluan  
       2019 年 7 月 25 日
    Windows 等平台时函数名会混淆? 具体是指什么,我感觉这个是可以解决的。
    scholarOfSin
        6
    scholarOfSin  
    OP
       2019 年 7 月 25 日
    coderluan
        7
    coderluan  
       2019 年 7 月 25 日
    @scholarOfSin 我看那个回答下面常见的可能性都提到了,你都试了还是解决不了?
    scholarOfSin
        8
    scholarOfSin  
    OP
       2019 年 7 月 25 日
    @coderluan 用到的函数前加上里面提到的语句就能解决了,所以才能够用 ctypes 调用成功。但是这部分代码只能在 VS 下使用,GCC 编译不通过,问题就来了
    coderluan
        9
    coderluan  
       2019 年 7 月 25 日   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 年 7 月 25 日
    @coderluan 受教了,我去试试。
    eastlhu
        11
    eastlhu  
       2019 年 7 月 26 日
    swig
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2863 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 38ms UTC 03:32 PVG 11:32 LAX 20:32 JFK 23:32
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86