我正在使用“ 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
答案 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 build
和python setup.py install
,并使用内联asm()将C语言库添加到Python的site-package文件夹中。
现在,您只需要在 example.py 这样的Python项目中进行操作:
import hectorASM
n = hectorASM.ADD(3, 4)
print(n)
希望这可以帮助其他人。