C++ SQLite函数调用都具有无效参数

C++ SQLite函数调用都具有无效参数,c++,eclipse,sqlite,invalid-argument,C++,Eclipse,Sqlite,Invalid Argument,我正在尝试将SQLite合并添加到我的项目中。根据,我“只是将合并复制到您的源目录中,并将其与项目中的其他C代码文件一起编译。”我还复制了sqlite3.h,因此我可以访问API 但是,对API的任何函数调用,例如: sqlite3 *db; int rc; rc = sqlite3_open("test.db", &db); 导致以下错误: 无效参数“ 候选人是: int sqlite3_open(常量字符*,**)' 数据设置.cpp /FCS/src 第24行 语义错误 我做错

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

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

sqlite3 *db;
int rc;

rc = sqlite3_open("test.db", &db);
导致以下错误:

无效参数“
候选人是:
int sqlite3_open(常量字符*,**)'

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


我做错了什么?我忽略了设置什么?

这个问题的特点是名称不匹配。因为C++允许函数根据它们的参数类型重载,所以C++编译器必须“将”它们发送到对象代码中的函数名进行编码,以对参数类型进行编码。C编译器不这样做,也不希望这样做。对C++编译器指定一个函数具有“C”链接禁用该函数名的名称篡改和重载;这就是
extern“C”
所做的


虽然C在很多方面与C++的子集相似,但这两种语言是不同的语言。最好用C编译器编译C代码。因此,你的一个选择是,将SQLite合并的C源与C++代码分开,例如,将其与库C++链接,并与C++对象文件链接,以生成最终的可执行文件。这是一种不同于C语言的语言,在C语言中实现了sqlite。我不确定合并是否会被C++编译器正确地构建,但是看起来你可能有名字的差异(这意味着“否”)。您可以通过在合并源文件中适当地放置一个或多个
extern“C”{}
块来解决此问题,也可能在头文件中。@JoachimPileborg错误是复制并粘贴出Eclipse。唯一的编辑是删除文件名、路径和行号。但我会编辑以包含这些内容。@JohnBollinger这已经包含在合并中了。在头文件中是:
#ifdef_ucplusplus extern“C”{#endif
头文件和编译的实现必须匹配,并且符号表明情况并非如此。合并的C源文件必须声明所有具有外部链接的函数都具有
extern“C”尤其是链接,否则必须用C编译器编译(也许你可以通过一个选项给编译器编译)。如果编译C++源,C源文件不包含SQLite头文件是不够的。