0

質問があります。

Python.h を使用していくつかの C コードを.soファイルにコンパイルする Makefile があります。ファイル@install -mを に配置するステートメントを追加しました。このライブラリを Python スクリプト内からインポートすると、Ubuntu 11.10 で問題なく動作しました。.so/usr/local/lib/python2.7/dist-packages

最終的に、これらすべてを Arch Linux で実行する必要がありましたが、dist-packages という名前のファイルが 1 つしかなく、ディレクトリがないことに気付きました。また、内部には何もなく/usr/local/lib、代わりに python2.7 が含まれてい/usr/libます。そのため、代わりにインストールパスをに変更しまし/usr/lib/python2.7/site-packagesた。今、それはこのエラーをスローします:

ImportError: <objectname>.so: Cannot open shared object file: No such file or directory

Makefile を使用して作成すると、ローカル ディレクトリにもファイルが作成されます。これは、指定されたパスに.soそのファイルを配置しなくても、既に機能しているはずです。.soその.soファイルを置くパスは、Python2.7 の sys.path にあります。この問題を解決する方法がわかりません。

理解を深めるために、ここに完全な Makefile を追加します。

PYTHON_VERSION = 2.7

PYINC = /usr/include/python$(PYTHON_VERSION)
PYLIB = python$(PYTHON_VERSION)
NUMPYINC = /usr/lib/python2.7/site-packages/numpy/core/include/

BASIC_NAME = vision
LIB_NAME = lib$(BASIC_NAME).so
MODULE_NAME = $(BASIC_NAME).so

all:: $(MODULE_NAME) 

#link compiled python wrapper code with c code and generate python module
$(MODULE_NAME): $(LIB_NAME) vision.o 
        gcc -shared -Wall vision.o -o $(MODULE_NAME) -l$(PYLIB) -L. -l$(BASIC_NAME)    

#generate c library, consisting of compiled c files (object files)
$(LIB_NAME): fireflymv.o image.o
        gcc -shared -Wall fireflymv.o image.o -o $(LIB_NAME) -ldc1394

#compile single c code file (basic c code)
fireflymv.o: fireflymv.c fireflymv.h
        gcc -Wall -fPIC -o fireflymv.o -c fireflymv.c 

#compile single c code file (basic c code)
image.o: image.c image.h
        gcc -Wall -fPIC -o image.o -c image.c

#compile single c code file (python wrapper code)
vision.o: vision.c
        gcc -Wall -fPIC -I$(PYINC) -I$(NUMPYINC) -o vision.o -c vision.c 

#install basic c code library into linux system (root permissions required)
install:
        @echo Installing $(LIB_NAME) and $(MODULE_NAME) to /usr/local/lib
        @install -m 0777 $(LIB_NAME) /usr/local/lib
        @install -m 0777 $(MODULE_NAME) /usr/local/lib
        @ldconfig

#remove basic c code library from linux system (root permissions required)
uninstall:
        @echo Removing $(LIB_NAME) and $(MODULE_NAME) from /usr/local/lib
        @-$(RM) /usr/local/lib/$(LIB_NAME)
        @-$(RM) /usr/local/lib/$(MODULE_NAME)
        @ldconfig

clean:
        rm -f *.o *.so *.pyc

これにより、vision.so と libvision.so の 2 つのファイルが作成されます。Vision.so は、Python スクリプトにインポートする必要があるものです。Libvision.so は、見つからないと言っているものです。もしそうならldd libvision.so、すべての接続は問題ありません。すると、同じディレクトリにありますがldd vision.so、取得できます。libvision.so ===> not foundファイルサイズも確認しました。ほぼ正しいようで、0 kb ファイルではありません。

4

1 に答える 1

1

dist-packagesはDebian/Ubuntuの発明であり、.debファイルからインストールされた配布パッケージとを使用してインストールされたPythonパッケージ間の競合を回避するために作成されましたsudo python setup.py install。アップストリームPythonはについてのみ知っていsite-packagesます。

インポートエラーについて.soですが、問題のArchLinuxシステムに存在しない他のライブラリにリンクされているようです。実行ldd /usr/lib/python2.7/site-packages/yourlibrary.soして、すべての外部参照が既存のライブラリファイルを指しているかどうかを確認できますか?

于 2012-03-18T18:09:08.373 に答える