编译我的扩展时,我得到一个链接器错误,说/usr/bin/ld: /usr/lib: No such file: File format not recognized
. 我注意到/usr/lib
出于某种奇怪的原因将其作为文件添加到 gcc 命令中。以下是命令及其输出:
python setup.py build
running build
running build_ext
building 'test' extension
gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes /usr/include -fPIC -I/usr/include/python2.6 -c test.c -o build/temp.linux-x86_64-2.6/test.o
gcc: /usr/include: linker input file unused because linking not done
gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions /usr/lib /usr/include build/temp.linux-x86_64-2.6/test.o -o build/lib.linux-x86_64-2.6/test.so
/usr/bin/ld: /usr/lib: No such file: File format not recognized
collect2: ld returned 1 exit status
error: command 'gcc' failed with exit status 1
我从所有东西中剥离了setup.py
除了基础知识之外的所有内容:
from distutils.core import setup, Extension
setup(
name = "test",
ext_modules =
[
Extension("test",
sources = [
"test.c"
]
)
]
)
这是test.c
:
#include <Python.h>
static PyObject *
py_run_executable(PyObject *self, PyObject *args)
{
char *file_path = NULL;
if (!PyArg_ParseTuple(args, "s", &file_path))
return NULL;
return PyInt_FromSize_t((size_t) 1);
}
PyDoc_STRVAR(pet_cpu__doc__, "Testing module");
PyDoc_STRVAR(run_executable__doc__, "Function doc");
static PyMethodDef pet_cpu_methods[] = {
{"run_executable", py_run_executable, METH_VARARGS, run_executable__doc__},
{NULL, NULL}
};
PyMODINIT_FUNC
initpet_cpu(void)
{
Py_InitModule3("test", pet_cpu_methods, pet_cpu__doc__);
}
我尝试过的和我的想法
如您所见,我试图消除扩展本身的问题,并保持最低限度。python
使用或设置路径的方式似乎存在某种配置错误distutils
。如果我运行失败的命令并删除/usr/lib /usr/include
:
$ gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions build/temp.linux-x86_64-2.6/test.o -o build/lib.linux-x86_64-2.6/test.so
运行此命令将执行链接并*.so
生成。似乎主要问题是distutils
编译本身而不是编译本身。
我的问题是,为什么要添加这两条路径?
运行它的计算机是安装了 python 2.6.6 的新 Debian 6.0。