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

How can I use sqlite3.c in a c++ project?

本文关键字:sqlite3 项目 c++      更新时间:2023-10-16

我正在尝试在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论坛上,请告诉我。

SQLite是用C语言编写的,C和C++之间有很多区别。不是很大的数字,但它们绝对不一样,也不是另一个的超集。因为您使用的是单个 Eclipse 项目,所以您可能最终尝试使用C++编译器编译 C 代码,因此在这些小差异上解脱了困境。

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

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

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 */
}

您的文件连接数据库将是:

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