Как построить библиотеку C для Python с кодом asm? - PullRequest
0 голосов
/ 10 мая 2019

Я собираю библиотеку C для python, используя "python.h", я успешно создал одну для добавления двух чисел: build-it и install-it. Но теперь я хочу добавить эти числа с помощью встроенного ассемблерного кода на языке C. Но когда я собираю файл C с помощью файла setup.py, он выдает ошибку. Кто-нибудь сделал что-то подобное и, вероятно, есть решения? Или у вас есть другие идеи сделать это.

Вот мой 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 голосов
/ 10 мая 2019

Этот ответ был получен от OP в качестве редактирования вопроса:


Я нашел решение и правильно скомпилировал и установил расширение.

Как сказал @ peter-cordesМне нужно было изменить компилятор, который использует distutils при выполнении python setup.py build.Для этого я сделал это, чтобы правильно решить проблему (это будет похоже на руководство для кого-то, кто хочет что-то подобное в Windows):

1.- Проверьте, установлен ли у вас MinGW, если да, добавьте binпапка к пути.Вы можете протестировать запуск gcc, если сделали это правильно.

2.- Создайте файл с именем distutils.cfg в вашей-Python-Version-folder \ Lib \ distutils (моя версия на python3.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 и скопируйте его в вашу-Python-Version-folder \ libs

Вот и все !!

Теперь вы можете запустить python setup.py build и python setup.py install и добавить библиотеку на C со встроенным asm () в папку вашего пакета сайта в Python.

Теперь вам нужно сделать только один проект в Python, например example.py :

import hectorASM

n = hectorASM.ADD(3, 4)

print(n)

Надеюсь, что это может помочь другим людям.

...