Sqlite加载扩展已禁用?

时间:2013-08-27 23:42:12

标签: sqlite

我正在尝试使用此sqlite extension来计算Sqlite dbs中的stdev,在Linux上,我使用此命令编译lib

  

gcc -fPIC -lm -shared extension-functions.c -o libsqlitefunctions.so

但似乎.load命令不在sqlite .help命令列表中,我收到错误:

  

未知命令或无效参数:“load”。输入“.help”获取帮助

使用命令时会发生同样的事情:

 sqlite> SELECT load_extension('./libsqlitefunctions.so');
  

SQL错误:没有这样的函数:load_extension

我尝试使用此指令编译sqlite:

0. untar latest sqlite3 source code in a new directory

1. cd to the newly untarred sqlite directory

2. Comment out the line in Makefile.in to enable loadable extensions:

     # TCC += -DSQLITE_OMIT_LOAD_EXTENSION=1

3. ./configure LIBS=-ldl && make sqlite3

4. export LD_LIBRARY_PATH="`pwd`:$LD_LIBRARY_PATH"

5. gcc -I`pwd` -shared src/test_loadext.c -o half.so

6. ./sqlite3

但是在最新的Sqlite源代码中找不到“TCC + = -DSQLITE_OMIT_LOAD_EXTENSION = 1”这一行。

2 个答案:

答案 0 :(得分:1)

看起来configure已更新但未更新文档。尝试

./configure --enable-dynamic-extensions

引用是configure源代码。进一步挖掘,默认情况下启用动态扩展。来自README

The generic installation instructions for autoconf/automake are found  
in the INSTALL file.

The following SQLite specific boolean options are supported:

  --enable-readline           use readline in shell tool   [default=yes]
  --enable-threadsafe         build a thread-safe library  [default=yes]
  --enable-dynamic-extensions support loadable extensions  [default=yes]

所以我认为load存在。这是错误无效参数的第二部分,这就是问题所在。

原因似乎是你正在使用Linux指令。那不行。 Mac通常没有.so个文件,这是您的编译命令生成的文件。

编译和加载可作为扩展程序加载的Mac动态库的方法是this location。编译命令看起来像

gcc -bundle -fPIC -I/path-to-sqlite/sqlite3 -o filename.sqlext filename.c

请注意-bundle-fPIC对于动态加载很重要,但是您缺少这些内容。生成的文件名为filename.sqlext,因此请在路径中使用。

答案 1 :(得分:1)

可能值得注意的是,加载库时可能会出现“缺少符号”错误 - 这是因为-lm标志需要位于编译命令的末尾:

gcc -fPIC -shared extension-functions.c -o libsqlitefunctions.so -lm

关心胖子乔尼