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、コンパイル自体ではなく、にあるようです。

私の質問は、なぜこれら 2 つのパスが追加されたのですか?

これを実行しているコンピューターは、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

問題はユーザーの環境パスにあったことがわかりました。ドットファイルがまったく変更されていないルートと同じコマンドを実行してみましたが、うまくいきました

問題は、CXXFLAGSCFLAGSLDFLAGSを手動で設定すると、.profileそれらがgccコマンドに含まれることでした。これが私の問題の行です.profile

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

これらが追加された理由は、autoconfまたはconfigureスクリプトを使用しない別のプロジェクトをコンパイルするために設定されたパスが必要だったためです。

これを答えとしてマークしています。これらのパスをコマンドに追加する正確な理由を誰かが思いついた場合は、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 に答える