我正在尝试在c ++程序中使用SQLite。我对C / C ++的了解有限,因为我在这一点上主要使用Java。我在大学里上了一些课程,但已经有一段时间了,我们从未涉及过这样的课程。 SQLite是用C语言编写的。在编译程序时你会怎么做? (我在我的Windows平台上安装了MinGW,所以gcc和g ++是我用来编译的。)
答案 0 :(得分:11)
您可以通过
保护C ++代码中的C标头extern "C" {
// your includes here
}
这应该是全部--- g++
应该很乐意链接gcc
和g++
的代码。 extern "C" ...
技巧也用于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
所以这当然已经得到了照顾。
答案 1 :(得分:3)
C ++通过使用extern "C"
声明实现了与C的兼容性。对extern "C"
的含义以及为什么在这个SO问题中需要它有一些很好的解释:Why do we need extern “C”{ #include } in C++?。实际上,所有基于C的库(包括sqlite)都通过在其头文件中包含extern "C"
来提供自动C ++兼容性。
因此,SQLite将使用而无需任何特殊处理(除了通常用于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
答案 2 :(得分:2)
对于特定的SQLite,没有什么比这更复杂的了。
如果您正在使用动态或静态库,则只需包含其标题并链接到正确的lib文件。
如果您在应用程序中完全包含SQLite,则需要在项目中包含所有源文件并构建它们,并根据需要包含标头(将其用作静态/动态库可能是虽然更好。
如果你需要在编译为C ++的文件中使用C代码,那么Dirk的答案是正确的,但SQLite不需要这样做。
答案 3 :(得分:1)
如何从C ++源代码调用C程序?
通过使用编译器提供的称为链接规范的工具。规范告诉编译器如何链接源代码
链接规范的格式为
extern "Language_Type"
{
}
在您的情况下,您可以包装SQLlite C函数,如
extern "C"
{
//SQLite function declarations
}
这应该使你能够使它工作但是由于你试图从C ++调用SQlite c函数,SQLite已经提供了一些包装器来实现你想要实现的目标。查看SQLite网站上的更多详细信息。此外,一些开源项目也提供您想要的。检查CppSQLite
希望这有帮助!