我正在尝试在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论坛,请告诉我。
答案 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项目作为依赖项。或者你可以构建它一次,并将其作为外部依赖;那也行得通。 (公平地说,这是一个外部依赖;你不应该把它真正地嵌入你的代码中,因为这将使跟踪错误修正更难。保持它分开 - 至少对于构建,即使不是为了分发 - 将使你的生活更多更容易。)