我正在尝试为基于arm的嵌入式设备交叉编译Python 2.7.3。我已成功编译它(基于这些指令:http://randomsplat.com/id5-cross-compiling-python-for-embedded-linux.html)并且所有测试都在目标设备上传递,因此我确信构建过程有效。我已经交叉编译了sqlite3(版本3.8.5)并将其包含在python交叉编译过程中,它似乎很好用(它不再列在构建过程结束时未找到的模块中) )。
我实际上在目标设备上导入sqlite3库时遇到了困难,我得到下面列出的错误(python正在运行-v标志)。
Python 2.7.3 (default, Jul 7 2014, 19:06:12)
[GCC 3.4.6] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlite3
import sqlite3 # directory /mnt/card/arm-python/lib/python2.7/sqlite3
# /mnt/card/arm-python/lib/python2.7/sqlite3/__init__.pyc matches /mnt/card/arm-python/lib/python2.7/sqlite3/__init__.py
import sqlite3 # precompiled from /mnt/card/arm-python/lib/python2.7/sqlite3/__init__.pyc
# /mnt/card/arm-python/lib/python2.7/sqlite3/dbapi2.pyc matches /mnt/card/arm-python/lib/python2.7/sqlite3/dbapi2.py
import sqlite3.dbapi2 # precompiled from /mnt/card/arm-python/lib/python2.7/sqlite3/dbapi2.pyc
dlopen("/mnt/card/arm-python/lib/python2.7/lib-dynload/datetime.so", 2);
import datetime # dynamically loaded from /mnt/card/arm-python/lib/python2.7/lib-dynload/datetime.so
dlopen("/mnt/card/arm-python/lib/python2.7/lib-dynload/time.so", 2);
import time # dynamically loaded from /mnt/card/arm-python/lib/python2.7/lib-dynload/time.so
dlopen("/mnt/card/arm-python/lib/python2.7/lib-dynload/_sqlite3.so", 2);
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/mnt/card/arm-python/lib/python2.7/sqlite3/__init__.py", line 24, in <module>
from dbapi2 import *
File "/mnt/card/arm-python/lib/python2.7/sqlite3/dbapi2.py", line 27, in <module>
from _sqlite3 import *
ImportError: File not found
似乎抱怨未找到&#34;文件&#34;但是我已经浏览了输出中列出的所有路径,所有文件似乎都存在。我可以做些什么来进一步诊断这个问题吗?
答案 0 :(得分:0)
我已经设法让它工作了,虽然我不认为我完全理解发生了什么,我不熟悉编译C / C ++代码以及整个静态/共享库和链接如何工作,也许某人可以对这里发生的事情有所了解。无论如何,这是我如何解决它。
首先我在python进程上运行了strace(Linux调试实用程序):
strace /mnt/card/arm-python/bin/python
这会在python进程启动时吐出一大堆输出,一旦它稳定下来我就试图导入sqlite库:
import sqlite3
然后会输出更多的输出,其中大部分与打开您导入的模块中涉及的文件有关。然后我注意到它设法打开_sqlite3.so
但不久之后它试图加载在库路径上找不到的libsqlite3.so
($ LD_LIBRARY_PATH)。
open("/mnt/card/arm-python/lib/python2.7/lib-dynload/_sqlite3.so", O_RDONLY|O_LARGEFILE) = 5
...
open("/lib/libsqlite3.so.0", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/libsqlite3.so.0", O_RDONLY) = -1 ENOENT (No such file or directory)
我将libsqlite3.so.0.8.6
从我的构建计算机上交叉编译的sqlite库中的/ lib目录复制到嵌入式arm设备上的/mnt/card
,并将其重命名为libsqlite3.so.0
。然后我将/mnt/card
添加到$ LD_LIBRARY_PATH,因为该路径中的现有位置驻留在只读文件系统上。
然后我再次尝试导入sqlite3,这一切似乎都运行正常。那么这些东西在lib-dynload
中的作用以及libsqlite3.so.0
的作用是什么?