我有个问题。
我有一个 Makefile,它用 Python.h 将一些 C 代码编译成一个.so
文件。我添加了将文件@install -m
放入的语句,当我从我的 Python 脚本中导入这个库时,它在 Ubuntu 11.10 中运行得很好。.so
/usr/local/lib/python2.7/dist-packages
最终我不得不在 Arch Linux 中运行所有这些,我注意到只有一个名为 dist-packages 的文件,没有目录,而且里面什么都没有,取而代之/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。Vision.so 是应该在 Python 脚本中导入的文件。Libvision.so 是它说找不到的那个。如果我这样做ldd libvision.so
,所有连接都很好。如果我这样做ldd vision.so
,我会得到libvision.so ===> not found
虽然它就在同一个目录中。我还检查了文件大小。这似乎是正确的,它不是一个 0 kb 的文件。