如何在c ++项目中使用sqlite3.c?

我试图在Eclipse的C ++项目中使用sqlite3,并在网上找到了大量关于使用API​​的建议,但不幸的是,我遇到了更早的障碍。 我想这是由于我缺乏C / C ++和CDT的经验。 我只是将sqlite3.c和sqlite3.h复制到项目的源文件夹中,并有一个测试方法,如下所示:

int main() { sqlite3* db; sqlite3** dbpointer = &db; const char* dbname = "test.db"; sqlite3_open(dbname, dbpointer); return 0; } 

但是,sqlite3.c文件在Eclipse中显示有很多错误。 例如,以下部分使用“字段”注释IN_DECLARE_VTAB’无法解析’。

 #ifdef SQLITE_OMIT_VIRTUALTABLE #define IN_DECLARE_VTAB 0 #else #define IN_DECLARE_VTAB (pParse->declareVtab) #endif 

当我尝试编译时,我得到一系列错误,如:

  gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/sqlite3.d" -MT"src/sqlite3.d" -o "src/sqlite3.o" "../src/sqlite3.c" ../src/sqlite3.c:30997: error: initializer element is not constant ../src/sqlite3.c:30997: error: (near initialization for `aSyscall[0].pCurrent') ../src/sqlite3.c:30997: error: initializer element is not constant ../src/sqlite3.c:30997: error: (near initialization for `aSyscall[0]') ../src/sqlite3.c:31009: error: initializer element is not constant ../src/sqlite3.c:31009: error: (near initialization for `aSyscall[1]') ../src/sqlite3.c:31017: error: initializer element is not constant ../src/sqlite3.c:31017: error: (near initialization for `aSyscall[2]') 

我确实在这里找到了类似的问题,但它似乎也没有得到解决。

我怀疑这是Eclipse的设置问题,所以如果有人能给我任何建议或指导有用的教程,我真的很感激。 如果我最好将其发布到专门的sqlite论坛,请告诉我。

你试过这种方式吗? (带双指针):

 int main() { sqlite3* db; const char* dbname = "test.db"; sqlite3_open(dbname, &db); return 0; } 

我想你正在研究linux。
另一种方法是执行脚本:

 int main() { system("connectDB.sh"); /* connectDB.sh should be chmod +x */ } 

您的文件connectDB将是:

 #!/bin/bash sqlite3 test.db "select * from test.table" 

SQLite是用C语言编写的,C和C ++之间存在许多差异。 不是很大的数字,但它们肯定不一样,也不是另一个的超集。 因为您使用的是单个Eclipse项目,所以您可能最终尝试使用C ++编译器编译C代码,因此会对这些小差异产生影响。

建议您将sqlite3.c构建到一个单独的库(它可以是静态库或动态库;您的调用)作为C项目,然后使您的C ++项目只使用该C项目作为依赖项。 或者你可以构建它一次,并将其作为外部依赖; 那也行得通。 (公平地说,它是一个外部依赖;你不应该把它完全嵌入你的代码中,因为这将使跟踪错误修正更难。保持它分开 – 至少对于构建,即使不是为了分发 – 将使你的生活更多更轻松。)