将C代码转换为Web程序集时出错

时间:2017-06-30 20:34:06

标签: python c emscripten webassembly cythonize

我已成功安装Emscripten并让它在 Ubuntu 16.04 虚拟机上运行。我还成功将helloworld.c文件转换为Web程序集。目前,我正在尝试使用emscripten将python转换为Web程序集。问题是emscripten当前不支持python,所以作为一个解决方法,我试图用Cython将python代码转换为C,这是我成功完成的。虽然我在尝试将cython c文件转换为Web程序集时遇到错误。这是控制台日志:

$emcc pony_gp.c -o pony_gp.html

In file included from pony_gp.c:11:
In file included from /usr/include/python2.7/Python.h:58:
/usr/include/python2.7/pyport.h:886:2: error: "LONG_BIT definition appears 
wrong for platform (bad gcc/glibc config?)."
#error "LONG_BIT definition appears wrong for platform (bad gcc/glibc config?)."
ERROR:root:compiler frontend failed to generate LLVM bitcode, halting

根据pyport.h,会产生此错误,因为在某些32位系统中,当LONG_BIT应该为32时,它被错误地定义为64.我试过注释掉这一行,但这只允许程序以静默方式运行,最终没有生成任何web汇编代码,只有html和javascript。

我已阅读here,问题是因为“cmake正在拾取一个版本的python dylib和一个单独版本的python for the headers”。这是有道理的,因为我最近从Python 2.7.13-1降级到Python 2.7.11-1,因为Python 2.7.13-1与python-dev软件包不兼容。虽然,我不知道如何解决这个问题。

有没有人知道该怎么做?

1 个答案:

答案 0 :(得分:2)

虽然不是完整的答案,但您应该能够使用clang将pony_gp.c直接编译为LLVM(.ll),最好是与Emscripten一起提供的相同的句子,例如:

source ~/emsdk/emsdk_env.sh
cython hello.py
clang `python2-config --cflags` -S -emit-llvm hello.c

然后,生成的.ll文件可以直接送到Emscripten。

用于生成完全可用的Python - > WebAssembly您可能还需要链接到Python运行时 - 您可以使用已经编译为LLVM字节码(.bc)的{emcc}分发的emsdk/emscripten/incoming/tests/python/python.bc

此外,这可能有所帮助:https://github.com/dgym/cpython-emscripten