如何使用asm代码为Python构建C库?

时间:2019-05-10 13:39:01

标签: python c assembly nasm setup.py

我正在使用“ python.h”为python构建一个C库,我成功地为一个库添加了两个数字,即build-it和install-it。但是现在我想在C中使用内联asm代码添加这些数字。但是当我使用setup.py构建C文件时,它给了我一个错误。有没有人做过这样的事情并且大概有解决方案?还是您有其他制作方法?

这是我的 hectorASMmodule.c

#include <Python.h>
#include <stdio.h>

static PyObject *hectorASM_ADD(PyObject *self, PyObject *args) {
    int num1, num2;
    if (!PyArg_ParseTuple(args, "ii", &num1, &num2)) {
        return NULL;
    }
    // int res = num1 + num2;
    int res = 0;
    __asm__("add %%ebx, %%eax;" : "=a"(res) : "a"(num1), "b"(num2));
    return Py_BuildValue("i", res);
}

static PyMethodDef hectorASM_methods[] = {
    // "PythonName"     C-function Name     argument presentation       description
    {"ADD", hectorASM_ADD, METH_VARARGS, "Add two integers"},
    {NULL, NULL, 0, NULL}   /* Sentinel */

};

static PyModuleDef hectorASM_module = {
    PyModuleDef_HEAD_INIT,
    "hectorASM",                       
    "My own ASM functions for python",
    0,
    hectorASM_methods                 
};

PyMODINIT_FUNC PyInit_hectorASM() {
    return PyModule_Create(&hectorASM_module);
}

这是我的 setup.py

from distutils.core import setup, Extension, DEBUG

module1 = Extension(
    'hectorASM',
    sources = ['hectorASMmodule.c']
)

setup (
    name = 'hectorASM',
    version = '1.0',
    description = 'My own ASM functions for python',
    author = 'hectorrdz98',
    url = 'http://sasukector.com',
    ext_modules = [module1]
)

这是我在运行python setup.py build时遇到的错误,它表明未定义' asm '。

hectorASMmodule.c
hectorASMmodule.c(11): warning C4013: '__asm__' sin definir; se supone que extern devuelve como resultado int
hectorASMmodule.c(11): error C2143: error de sintaxis: falta ')' delante de ':'
error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x64\\cl.exe' failed with exit status 2

1 个答案:

答案 0 :(得分:0)

此答案来自OP,是对问题的修改:


我找到了解决方案,并且正确编译并安装了扩展程序。

正如@ peter-cordes所说,我需要更改在执行python setup.py build时使用 distutils 的编译器。为此,我做了这些事情来正确地解决了问题(对于想要在Windows上使用类似功能的人来说,它就像是一个指南):

1.-检查是否已安装MinGW,如果已安装,则将bin文件夹添加到路径。如果操作正确,您可以测试正在运行的gcc。

2.-在您的Python版本文件夹\ Lib \ distutils上创建一个名为 distutils.cfg 的文件(我的python版本为3.6,因此该文件夹位于AppData \ Local \ Programs \ Python中\ Python36)。文件内容为:

[build]
compiler=mingw32

3.-编辑与上一个文件处于同一级别的文件 cygwinccompiler.py 。您必须在此处添加以下代码行以支持另一个msc_ver:

(上一行代码):
return ['msvcr100']

(添加此行):

elif msc_ver == '1700':
   # Visual Studio 2012 / Visual C++ 11.0
   return ['msvcr110']
elif msc_ver == '1800':
   # Visual Studio 2013 / Visual C++ 12.0
   return ['msvcr120']
elif msc_ver == '1900':
   # Visual Studio 2015 / Visual C++ 14.0
   return ['vcruntime140']

(下一行):

else:   
   raise ValueError("Unknown MS Compiler version %s " % msc_ver)

4.-下载 vcruntime140.dll 并将其复制到your-Python-Version-folder \ libs

仅此而已!

现在,您可以运行python setup.py buildpython setup.py install,并使用内联asm()将C语言库添加到Python的site-package文件夹中。

现在,您只需要在 example.py 这样的Python项目中进行操作:

import hectorASM

n = hectorASM.ADD(3, 4)

print(n)

希望这可以帮助其他人。