【问题标题】:SQLite function calls all have invalid argumentsSQLite 函数调用都有无效参数
【发布时间】:2014-12-13 03:16:04
【问题描述】:

我正在尝试将 SQLite Amalgamation 添加到我的项目中。根据their page,我“只需将合并复制到您的源目录中,然后将其与项目中的其他 C 代码文件一起编译。”我还复制了 sqlite3.h,所以我可以访问 API。

但是,对 API 的任何函数调用,例如:

sqlite3 *db;
int rc;

rc = sqlite3_open("test.db", &db);

导致以下错误:

无效参数 '
候选人是:
int sqlite3_open(const char *, * *) '

数据设置.cpp
/FCS/src
第 24 行
语义错误

我在这里做错了什么?我忽略了哪些设置?

【问题讨论】:

  • 请显示 completeunedited 错误输出。
  • 您已标记问题 C++。这是一种与 C 不同的语言,其中实现了 sqlite。我不确定合并是否会由 C++ 编译器正确构建,但看起来您可能在名称修饰方面有所不同(这意味着“否”)。您可以通过在合并源文件中适当放置一个或多个 extern "C" { } 块来解决问题,也可能在标题中。
  • @JoachimPileborg 错误是从 Eclipse 中复制和粘贴出来的。唯一的编辑是删除文件名、路径和行号。但我会编辑以包含这些内容。
  • @JohnBollinger 这已包含在合并中。在头文件中是:#ifdef __cplusplus extern "C" { #endif
  • 头文件和编译的实现必须匹配,并且标志表明你不是这种情况。合并的 C 源文件必须将所有具有外部链接的函数声明为特别具有 extern "C" 链接,否则您必须使用 C 编译器进行编译(也许您可以将选项传递给编译器以使其执行此操作)。如果您将 C 源文件编译为 C++ 源文件,则仅包含 sqlite 标头是不够的。

标签: c++ eclipse sqlite invalid-argument


【解决方案1】:

该问题具有名称修改不匹配的特征。因为 C++ 允许基于函数的参数类型重载函数,所以 C++ 编译器必须将它们发出的函数名“修改”到目标代码中以对参数类型进行编码。 C 编译器不这样做,也不期望对它们这样做。向 C++ 编译器指定函数具有“C”链接会禁用名称修改和该函数名称的重载;这就是extern "C" 所做的。

尽管 C 在许多方面与 C++ 的子集相似,但两者是不同的语言。最好用 C 编译器编译 C 代码。因此,您的一种选择是将 sqlite 合并的 C 源代码与您的 C++ 代码分开构建到一个库中,然后将其与您的 C++ 目标文件链接以生成最终的可执行文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 2017-06-21
    • 2014-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    相关资源
    最近更新 更多