我试图在C++程序中使用SQLite。我对C/C++的了解很有限,因为我主要在这方面使用Java。我在大学上过一些课,但已经有一段时间了,我们从未涉及过这样的事情。 SQLite是用C语言编写的。编译程序时你会怎么做? (我在我的Windows安装MinGW的平台,gcc和g ++是我用来编译。)如何编译包含C源文件的C++源代码?
回答
您可以通过
extern "C" {
// your includes here
}
保护你的C++代码的C头文件,这应该是所有--- g++
应该愉快地链接gcc
和g++
的代码。技巧还可用于C++系统头文件和许多库中,只需查看g ++安装或某些合适的Open Source项目随附的头文件即可。这里是一个Boost例如:
[email protected]:~$ 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"
[email protected]:~$
编辑:感谢delnan一个细心的意见---这是从sqlite3.h头本身:
/*
** Make sure we can call this stuff from C++.
*/
#ifdef __cplusplus
extern "C" {
#endif
所以这当然是已经已搞定。
注意:如果SQLite头文件已经有了这个命令(以及'#ifdef __cplusplus'技巧,只有在C++程序中包含此功能时才会执行此操作),我不会感到惊讶。 – delnan 2011-03-26 16:19:24
我忘记了一点:即使** C **系统以及许多库头文件都有这个技巧。 – 2011-03-26 16:21:13
对于特定的SQLite,没有什么复杂的。
如果您使用的是动态库或静态库,只需将它们的头文件和链接包含在正确的lib文件中即可。
如果您将SQLite完全包含在您的应用程序中,则需要将所有源文件包含在您的项目中并构建它们,并根据需要包含标题(将其用作静态/动态库可能尽管如此)。
如果您需要在编译为C++的文件中使用C代码,Dirk的答案是正确的,但SQLite不需要这样做。
当我使用g ++编译我的cpp文件时,我得到的唯一错误是“undefined reference to ...”错误,其中......部分是sqlite函数。我已经包含sqlite3.h文件...不知道我在做什么错... – Kenneth 2011-03-26 16:25:07
你说,包括标题和链接反对正确的库(对于静态或动态库),你可以进一步解释吗? – Kenneth 2011-03-26 16:26:20
我对g ++并不十分熟悉,但是你是否正确地包含了所有内容,名称是否正确,提供给链接器的必要文件?至于我的评论,你需要提供正确的库链接器取决于你想如何建立SQLite(如果你已经建立它作为一个共享模块/ DLL或如果你想它被包括在内)。 – ssube 2011-03-26 16:26:46
如何从C++源代码调用C程序?
通过使用由编译器提供的称为链接规范的设施。该规范告诉编译器如何链接源代码。
联动规范格式
extern "Language_Type"
{
}
在你的情况你可以用像
extern "C"
{
//SQLite function declarations
}
您SQLlite C函数这将使你得到它的工作,但既然你想打电话SQlite的ç来自C++的函数,SQLite已经提供了一些包装来实现你正在努力实现的目标。查看SQLite网站上的更多细节。另外,一些开源项目也提供你想要的。检查CppSQLite
希望这可以帮助!
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
- 1. C++代码使用.cpp源代码编译,但不包含.c
- 2. 如何编译具有C源代码的Frama-C插件?
- 3. 如何避免包含apk中的jni c源代码文件
- 4. eclipse for android c源代码 - 如何解决编译头文件?
- 5. 如何在包含的C++源代码中编写外部文件的路径
- 6. 如何在C++源代码中包含极长的文字?
- 7. 编译时在所有.c源文件中包含#define
- 8. 编译C源代码时出错
- 9. Haxe编译为C++和JS源代码
- 10. MagickNet C++源代码编译失败
- 11. c#编译数据库源代码
- 12. 编译器独立C++代码资源
- 13. 为Android编译C++ 11源代码NDK
- 14. Dev C++编译C源文件
- 15. xcode不编译c源码
- 16. 包含更多行的c源代码文件
- 17. C++代码编译时不包含
- 18. 如何解码gcc编译的c源代码
- 19. 如何在编译内核模块源代码时包含标准头文件?
- 20. 将源代码管理用于其资源的C++编译器
- 21. 如何Python的(C)的源代码编译成共享库
- 22. 如何用C头文件和CUDA代码编译C代码?
- 23. 如何将Linux C++源代码转换为Windows C++源代码?
- 24. 如何编译包含多个源文件的项目?
- 25. 在C中包含源文件
- 26. 在Linux上为不同的平台编译C/C++源代码
- 27. 在运行时编译c源代码中的另一个源代码
- 28. 在c编译多个源文件
- 29. 编译C代码与出.C文件
- 30. 如何在C#/ Visual Studio中包含源代码而不是库?
一个程序如何可以包含另一个程序? – Nawaz 2011-03-26 16:05:03
既然我们是技术人员,我很惊讶你没有问你如何编译一个程序。我对标题进行了修改,以反映我的问题更加准确。 – Kenneth 2011-03-26 16:13:57