【问题标题】:Compiling with distutils: /usr/lib is added as a file to compile使用 distutils 编译: /usr/lib 添加为文件进行编译
【发布时间】: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__);
 }

我的尝试和想法

如您所见,我已尝试消除扩展程序本身的问题,并保持最低限度。使用pythondistutils 设置路径的方式似乎存在某种配置错误。如果我运行失败的命令并删除 /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


    【解决方案1】:

    环境变量CFLAGS 可用(如果可用)。

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

    【讨论】:

    • 谢谢你,HonkyTonk。我显然需要详细了解CLFAGS 的一般使用方式以及一般环境变量。
    • @rzetterberg 很高兴我能帮上忙。
    【解决方案2】:

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

    问题在于,当在.profile 中手动设置CXXFLAGSCFLAGSLDFLAGS 时,它们会包含在gcc 命令中。以下是我的.profile 中的问题行:

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

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

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

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题。正如@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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多