我正在尝试使用此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”这一行。
答案 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
关心胖子乔尼