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

时间:2013-09-08 15:09:49

标签: c++ c sqlite eclipse-cdt

我正在尝试在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]')

我确实找到了一个类似的问题here,但它似乎也没有得到解决。

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

2 个答案:

答案 0 :(得分:1)

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

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" 

答案 1 :(得分:1)

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

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