5

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

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

但似乎 .load 命令不在 sqlite .help 命令列表中,并且出现错误:

未知命令或无效参数:“加载”。输入“.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”行。

4

2 回答 2

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 动态库的编译和加载方法,可以作为扩展加载,就在这个位置。编译命令看起来像

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

请注意-bundleand-fPIC这对于动态加载很重要,但您缺少。生成的文件名将是filename.sqlext,所以在你的路径中使用它。

于 2013-08-28T00:29:45.973 回答
1

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

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

问候胖强尼

于 2013-11-11T19:59:41.787 回答