我正在尝试在C++程序中使用SQLite。由于我大多数时间都使用Java,因此我的C/C++知识有限。虽然我在大学里学过一些课程,但已经过了一段时间,我们从未涉及这方面的内容。SQLite是用C编写的。在编译程序时,您应该如何操作?(我在Windows平台上安装了MinGW,因此使用gcc和g++进行编译。)
我正在尝试在C++程序中使用SQLite。由于我大多数时间都使用Java,因此我的C/C++知识有限。虽然我在大学里学过一些课程,但已经过了一段时间,我们从未涉及这方面的内容。SQLite是用C编写的。在编译程序时,您应该如何操作?(我在Windows平台上安装了MinGW,因此使用gcc和g++进行编译。)
在 C++ 代码中,您可以通过
保护 C 头文件。extern "C" {
// your includes here
}
这应该就是全部了——g++
应该可以愉快地链接来自 gcc
和 g++
的代码。在 C++ 系统头文件和许多库中也使用了 extern "C" ...
技巧,只需查看您的 g++ 安装或一些合适的开源项目所附带的头文件即可。这里有一个Boost 示例:
edd@max:~$ grep 'extern "C"' /usr/include/boost/date_time/*
/usr/include/boost/date_time/filetime_functions.hpp: extern "C" {
/usr/include/boost/date_time/filetime_functions.hpp: } // extern "C"
edd@max:~$
编辑: 感谢 delnan 的细心评论 --- 这是来自 sqlite3.h 头文件本身的内容:
/*
** Make sure we can call this stuff from C++.
*/
#ifdef __cplusplus
extern "C" {
#endif
所以当然已经处理好了。
#ifdef __cplusplus
技巧,只有在被C++程序包含时才会执行此操作),我不会感到惊讶。 - user395760extern "C"
声明实现与C的兼容性。关于extern "C"
的含义和为什么需要它,有一些很好的解释在这个SO问题中:Why do we need extern “C”{ #include } in C++?。几乎所有基于C的库,包括sqlite,在其头文件中包含extern "C"
以提供自动的C++兼容性。/* my_sqlite_program.cpp */
#include <sqlite3.h>
int main()
{
...call sqlite functions...
}
编译使用
g++ -Wall -Werror my_sqlite_program.cpp -lsqlite3 -o my_sqlite_program
sqlite3.h
,其中描述了函数,以及库文件,其中提供了函数的实现。在g++命令行上提供-lsqlite3
会导致您的程序链接到sqlite3的库实现文件。实际的库文件是/usr/lib/libsqlite3
的某个版本,但gcc使用-lsqlite3
作为指定它的速记方式。 - Brent Bradburnextern "Language_Type"
{
}
在您的情况下,您可以像这样包装您的SQLlite C函数
extern "C"
{
//SQLite function declarations
}
这应该能让你的程序正常工作,但是由于你试图从C++调用SQLite的C函数,SQLite已经提供了一些包装器来实现你想要的功能。请在SQLite官网上查看更多详细信息。此外,一些开源项目也提供了你所需的功能。请查看CppSQLite
希望对你有所帮助!