【发布时间】:2012-08-13 09:46:57
【问题描述】:
在编译我的扩展时,我收到一个链接器错误,提示 /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。
【问题讨论】:
标签: python linux gcc distutils