2011-03-26 132 views
3

我试图在C++程序中使用SQLite。我对C/C++的了解很有限,因为我主要在这方面使用Java。我在大学上过一些课,但已经有一段时间了,我们从未涉及过这样的事情。 SQLite是用C语言编写的。编译程序时你会怎么做? (我在我的Windows安装MinGW的平台,gcc和g ++是我用来编译。)如何编译包含C源文件的C++源代码?

+3

一个程序如何可以包含另一个程序? – Nawaz 2011-03-26 16:05:03

+1

既然我们是技术人员,我很惊讶你没有问你如何编译一个程序。我对标题进行了修改,以反映我的问题更加准确。 – Kenneth 2011-03-26 16:13:57

回答

11

您可以通过

extern "C" { 

    // your includes here 

} 

保护你的C++代码的C头文件,这应该是所有--- g++应该愉快地链接gccg++的代码。技巧还可用于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 

所以这当然是已经已搞定。

+0

注意:如果SQLite头文件已经有了这个命令(以及'#ifdef __cplusplus'技巧,只有在C++程序中包含此功能时才会执行此操作),我不会感到惊讶。 – delnan 2011-03-26 16:19:24

+0

我忘记了一点:即使** C **系统以及许多库头文件都有这个技巧。 – 2011-03-26 16:21:13

2

对于特定的SQLite,没有什么复杂的。

如果您使用的是动态库或静态库,只需将它们的头文件和链接包含在正确的lib文件中即可。

如果您将SQLite完全包含在您的应用程序中,则需要将所有源文件包含在您的项目中并构建它们,并根据需要包含标题(将其用作静态/动态库可能尽管如此)。

如果您需要在编译为C++的文件中使用C代码,Dirk的答案是正确的,但SQLite不需要这样做。

+0

当我使用g ++编译我的cpp文件时,我得到的唯一错误是“undefined reference to ...”错误,其中......部分是sqlite函数。我已经包含sqlite3.h文件...不知道我在做什么错... – Kenneth 2011-03-26 16:25:07

+0

你说,包括标题和链接反对正确的库(对于静态或动态库),你可以进一步解释吗? – Kenneth 2011-03-26 16:26:20

+0

我对g ++并不十分熟悉,但是你是否正确地包含了所有内容,名称是否正确,提供给链接器的必要文件?至于我的评论,你需要提供正确的库链接器取决于你想如何建立SQLite(如果你已经建立它作为一个共享模块/ DLL或如果你想它被包括在内)。 – ssube 2011-03-26 16:26:46

1

如何从C++源代码调用C程序?
通过使用由编译器提供的称为链接规范的设施。该规范告诉编译器如何链接源代码。
联动规范格式

extern "Language_Type" 
{ 

} 

在你的情况你可以用像

extern "C" 
{ 
    //SQLite function declarations 
} 

您SQLlite C函数这将使你得到它的工作,但既然你想打电话SQlite的ç来自C++的函数,SQLite已经提供了一些包装来实现你正在努力实现的目标。查看SQLite网站上的更多细节。另外,一些开源项目也提供你想要的。检查CppSQLite
希望这可以帮助!

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 
+0

does -lsqlite3是指包含的头文件或其他文件? – Kenneth 2011-03-26 16:58:55

+1

这是一个不同的文件。要使用C或C++库,需要包含描述函数的头文件'sqlite3.h'和提供函数实现的库文件。在g ++命令行中提供'-lsqlite3'会导致程序与sqlite3的库实现文件链接。实际的库文件是'/ usr/lib/libsqlite3'的一些版本,但是gcc使用'-lsqlite3'作为指定它的简写方式。 – nobar 2011-03-26 17:08:16