Как вы компилируете исходный код C ++, который включает исходный файл C? - PullRequest
3 голосов
/ 26 марта 2011

Я пытаюсь использовать SQLite в программе на С ++. Мои знания C / C ++ ограничены, так как я до сих пор использовал Java. У меня было несколько занятий в колледже, но это было какое-то время, и мы никогда не освещали ничего подобного. SQLite написан на C. При компиляции программы, как бы вы это сделали? (У меня установлена ​​платформа MinGW на моей платформе Windows, поэтому для компиляции я использую gcc и g ++.)

Ответы [ 4 ]

11 голосов
/ 26 марта 2011

Вы защищаете заголовки 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

, поэтому об этом, конечно, уже позаботились.

3 голосов
/ 26 марта 2011

C ++ достигает совместимости с C посредством использования extern "C" объявлений. Есть несколько хороших объяснений того, что означает extern "C" и почему это необходимо в этом вопросе SO: Зачем нам нужен extern «C» {#include} в C ++? . Практически все библиотеки на основе C, включая sqlite, обеспечивают автоматическую совместимость с C ++, включая extern "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 голосов
/ 26 марта 2011

В частности, для SQLite в этом нет ничего сложного.

Если вы используете динамическую или статическую библиотеку, просто включите их заголовки и ссылку на соответствующие файлы lib.

Если вы полностью включите SQLite в свое приложение, вынеобходимо включить все исходные файлы в ваш проект, а также собрать их, а также включить заголовки по мере необходимости (хотя использование статической / динамической библиотеки может быть более приятным).

Если вам нужно использовать код на Cв файлах, скомпилированных как C ++, ответ Дирка правильный, но для SQLite это не нужно.

1 голос
/ 26 марта 2011

Как вы можете вызывать программы на C из исходного кода C ++?
Используя средство, называемое спецификацией связывания, предоставляемой компиляторами.Спецификация сообщает компилятору, как связать исходный код.
Спецификация связывания имеет формат

extern "Language_Type" 
{ 

}

В вашем случае вы можете обернуть свои функции SQLlite C, например

extern "C" 
{
    //SQLite function declarations
}

Это должно позволить вам заставить его работать, но поскольку вы пытаетесь вызывать функции SQlite c из C ++, SQLite уже предоставляет некоторые оболочки для достижения того, чего вы пытаетесь достичь.Проверьте более подробную информацию на веб-сайте SQLite.Кроме того, некоторые проекты с открытым исходным кодом также предоставляют то, что вы хотите.Проверьте CppSQLite
Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...