你如何编译包含C源文件的C ++源代码?

时间:2011-03-26 16:00:54

标签: c++ c compiler-construction

我正在尝试在c ++程序中使用SQLite。我对C / C ++的了解有限,因为我在这一点上主要使用Java。我在大学里上了一些课程,但已经有一段时间了,我们从未涉及过这样的课程。 SQLite是用C语言编写的。在编译程序时你会怎么做? (我在我的Windows平台上安装了MinGW,所以gcc和g ++是我用来编译的。)

4 个答案:

答案 0 :(得分:11)

您可以通过

保护C ++代码中的C标头
extern "C" { 

   // your includes here

}

这应该是全部--- g++应该很乐意链接gccg++的代码。 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
希望这有帮助!