4

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

4

2 回答 2

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" 
于 2013-12-11T11:42:36.420 回答
1

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

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

于 2013-12-11T12:36:13.707 回答