我在Debian上的linux2上使用Python 2.7.6(默认,2014年3月22日,22:59:56)[GCC 4.8.2],我通常使用模块sqlite3
而没有任何模块问题
我compiled a Sqlite extension spellfix
,加载时出现此错误:
sqlite3.OperationalError:./spellfix.so:undefined symbol:sqlite3_malloc64
我认为可能是因为sqlite3
模块太旧了:
import sqlite3
print sqlite3.version # 2.6.0
print sqlite3.sqlite_version # 3.8.2
(在sqlite3.sqlite_version
为3.8.7.x的另一台机器上,扩展加载正常)。
我试过了:
pip install --upgrade pysqlite
但它仍然相同:sqlite3.sqlite_version
保持3.8.2。
如何升级Python sqlite3模块(内置于标准库中)?
答案 0 :(得分:4)
您认为sqlite3
的版本导致问题是正确的。 sqlite_malloc64
引入了sqlite3
。
我建议不要尝试升级可能最终破坏Python安装的Python spellfix.c
模块,而是建议编译版本3.8.2中包含的sh configure
make sqlite3.c
版本。
您可以在此处找到来源:release 3.8.7
从那里你可以建立合并:
sqlite3.h
sqlite3ext.h
文件夹中有tsrc
和spellfix.c
。然后使用:
gcc -g -fPIC -shared spellfix.c -I ../../tsrc -o spellfix.dll
扩展名
spellfix.dll
您应该获得与您的sqlite3版本一起运行的兼容void Board::setPieceAtPosition(int index, Piece &piece)
{
piece.setRow(index / 8);
piece.setCol(index % 8);
}
char Piece::convertColToLetter()
{
char letter = col + 49;
return letter;
}
void Piece::display()
{
char colLetter = convertColToLetter();
int row = this->row + 1;
if (isWhite)
{
std::cout << "White ";
}
else
{
std::cout << "Black ";
}
std::cout << name << " at " << colLetter << row << std::endl;
。
答案 1 :(得分:2)
这是一个手动解决方案(不推荐,但由于我没有为我的Linux安装找到libsqlite3 v3.23.1的后端,我尝试了这个,并且它有效):
从https://packages.debian.org/search?keywords=libsqlite3-0下载更新的版本。这是一个直接链接:
wget http://ftp.de.debian.org/debian/pool/main/s/sqlite3/libsqlite3-0_3.23.1-1_amd64.deb
在。临时文件夹中解压缩.deb:
mkdir tmp
dpkg -x libsqlite3-0_3.23.1-1_amd64.deb tmp
或
mkdir tmp; cd tmp; ar x ../libsqlite3-0_3.23.1-1_amd64.deb; tar xvfJ data.tar.xz; cd ..
然后
# keep the old one in case it wouldn't work!
mv /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6 /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6.old
# copy the new one in the right place
cp tmp/usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6 /usr/lib/x86_64-linux-gnu/libsqlite3.so.0.8.6
它应该有效:
python -c "import sqlite3; print sqlite3.sqlite_version" # 3.23.1
免责声明:这有点黑客,但它确实有效。