0

编译我的扩展时,我得到一个链接器错误,说/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。

4

3 回答 3

1

CFLAGS如果可用,则尊重环境变量。

如果您查看Tweaking compiler/linker flags@ http://docs.python.org/install/,它清楚地描述为与环境变量有关的默认行为。

于 2012-08-13T16:25:21.840 回答
0

原来问题出在我的用户的环境路径上。我尝试运行与 root 相同的命令,其中点文件根本没有更改,并且运行良好。

问题是当CXXFLAGS, CFLAGS,LDFLAGS手动设置时,.profile它们包含在gcc命令中。以下是我的问题行.profile

export CFLAGS="/usr/include"   
export CXXFLAGS="/usr/include"  
export LDFLAGS="/usr/lib"

为什么添加这些是因为我需要设置路径来编译另一个不使用autoconfconfigure-script 的项目。

我将此标记为答案。如果有人想出为什么distutils将这些路径添加到命令中的确切原因,我将接受该答案。

于 2012-08-13T12:31:07.843 回答
0

我遇到了同样的问题。正如@rzetterberg 所述,这是LDFLAGS.

原来我设置LDFLAGS~/.bashrc export LDFLAGS=/some/path/cuda/cuda-9.0/cuda/lib64

并且应该修改为: export LDFLAGS=-L/some/path/cuda/cuda-9.0/cuda/lib64

于 2018-10-29T06:43:33.220 回答