我已经将sqlite3.c编译到我的应用程序中,将extension-functions.c(hxxps://www.sqlite.org/contrib)编译成共享库,并且它可以正常工作,但是对于我正在处理的项目,我必须将sqlite3 + extension functions静态链接到一个C++应用程序中。
我已经阅读了很多关于这个主题的资料,但是我无法让它正常工作。
最小示例(test.cc):
构建命令:
"
使用注释行代替:
最小示例(test.cc):
#include "sqlite3.h"
#include<cstdlib>
void sqlite3_extension_functions_init(void);
// typedef struct sqlite3_api_routines sqlite3_api_routines;
// int sqlite3_extension_functions_init(sqlite3 *db, char **pzErrMsg, const sqlite3_api_routines *pApi);
int main(int argc,char *argv[]) {
// sqlite3_auto_extension( (void(*)(void))sqlite3_extension_functions_init );
sqlite3_auto_extension( sqlite3_extension_functions_init );
sqlite3 *database_;
sqlite3_open_v2("test.db", &database_, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);
sqlite3_close_v2(database_);
return 0;
}
构建命令:
gcc -o test sqlite3.c extension_functions.c test.cc -lpthread -lm -ldl -DSQLITE_CORE
"
(-DSQLITE_CORE没有影响吗?)
错误:
"/tmp/ccPfaDLE.o: In function `main':
test.cc:(.text+0x10): undefined reference to `sqlite3_extension_functions_init()'
collect2: ld returned 1 exit status
使用注释行代替:
/tmp/ccrs9B0K.o: In function `main':
test.cc:(.text+0x10): undefined reference to `sqlite3_extension_functions_init(sqlite3*, char**, sqlite3_api_routines const*)'
collect2: ld returned 1 exit status
- 来自SQLite 3.8.6的sqlite3.c、sqlite3.h、sqlite3ext.h
- https://www.sqlite.org/contrib中的extension_functions.c(重命名为extension-functions.c) -> 根据http://sqlite.1065341.n5.nabble.com/Example-Showing-ACTUAL-Use-of-sqlite3-auto-extension-td27657.html进行静态链接修改,并将
int sqlite3_extension_init()
重命名为int sqlite3_extension_functions_init()
我使用的其他来源:
- hxxp://books.google.de/books?vid=ISBN1449399649&q=209
- hxxps://www.sqlite.org/loadext.html
- hxxp://stackoverflow.com/a/1295765
test.cc
中没有说明sqlite3_extension_functions_init()
是一个C函数(它会认为是C ++),而鉴于您的命令行,我假设它在extension_functions.c
中,因此在test.cc
中声明时需要使用extern "C" { ... }
。 - Karel Kubatextern "C" { ... }
的可能性。此外,我希望我的最小示例是纯C代码,但当然... gcc将*.cc文件编译为C++代码,而我的实际程序也是C++。因此,一个可运行的最小示例可以使用gcc ... test.c ...
或gcc -x c ...
,或在C++情况下使用extern "C" { ... }
。如果您发布答案,我会接受它。 :) - Striker