2013-09-08 2 views
4

Я пытаюсь использовать sqlite3 в проекте C++ в Eclipse и нашел много советов в Интернете по использованию API, но, к сожалению, я падал на более раннее препятствие. Я предполагаю, что это связано с отсутствием опыта работы с C/C++ и CDT. Я просто скопировал sqlite3.c и sqlite3.h в исходной папке проекта и есть метод тестирования, который выглядит следующим образом:Как использовать sqlite3.c в проекте C++?

int main() { 
    sqlite3* db; 
    sqlite3** dbpointer = &db; 
    const char* dbname = "test.db"; 
    sqlite3_open(dbname, dbpointer); 
    return 0; 
} 

Однако файл sqlite3.c показывает в Eclipse, с многочисленными ошибками. Например, в следующем разделе аннотируется «Поле» IN_DECLARE_VTAB «не может быть разрешено».

#ifdef SQLITE_OMIT_VIRTUALTABLE 
    #define IN_DECLARE_VTAB 0 
#else 
    #define IN_DECLARE_VTAB (pParse->declareVtab) 
#endif 

Когда я пытаюсь скомпилировать я получаю серию ошибок, таких как:

gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/sqlite3.d" -MT"src/sqlite3.d" -o "src/sqlite3.o" "../src/sqlite3.c" 
../src/sqlite3.c:30997: error: initializer element is not constant 
../src/sqlite3.c:30997: error: (near initialization for `aSyscall[0].pCurrent') 
../src/sqlite3.c:30997: error: initializer element is not constant 
../src/sqlite3.c:30997: error: (near initialization for `aSyscall[0]') 
../src/sqlite3.c:31009: error: initializer element is not constant 
../src/sqlite3.c:31009: error: (near initialization for `aSyscall[1]') 
../src/sqlite3.c:31017: error: initializer element is not constant 
../src/sqlite3.c:31017: error: (near initialization for `aSyscall[2]') 

я сделал найти подобный вопрос here, но это, кажется, не были решены там.

Я подозреваю, что это проблема с настройкой Eclipse, поэтому, если кто-нибудь может дать мне какие-либо советы или указания по полезным учебникам, я бы очень признателен. И если мне будет лучше опубликовать это на специальном форуме sqlite, просто дайте мне знать.

+2

Какую версию GCC вы используете? –

+0

Вы попробовали предложение Уоррена Янга (в этой ссылке), чтобы проверить противоречивые определения 'SYSCALL'? – Cornstalks

+0

В итоге я перебрался в Ubuntu и у меня было намного легче. Если мне удастся заставить это работать в Windows в любой момент, я отправлю ответ. –

ответ

1

Вы пытаетесь таким образом? (с двойным указателем):

int main() { 
    sqlite3* db; 
    const char* dbname = "test.db"; 
    sqlite3_open(dbname, &db); 
    return 0; 
} 

Предполагаете, что вы работаете над linux.
Другой подход заключается в выполнении сценария:

int main() { 
    system("connectDB.sh"); 
    /* connectDB.sh should be chmod +x */ 
} 

Файл connectDB будет:

#!/bin/bash 
sqlite3 test.db "select * from test.table" 
1

SQLite написана в C, и существует целый ряд различий между C и C++. Не огромные числа, но они определенно не то же самое, и ни один из них не является надмножеством другого. Поскольку вы используете один проект Eclipse, вероятно, вы, вероятно, пытались скомпилировать C-код с компилятором C++ и поэтому откладываете эти небольшие различия.

Рекомендуется создать sqlite3.c в отдельной библиотеке (это может быть статическая библиотека или динамическая, ваш вызов) в качестве проекта C, а затем сделать ваш проект на C++ просто использующим этот проект C как зависимость , Или вы можете построить его один раз и просто иметь его как внешнюю зависимость; это тоже сработает. (Чтобы быть справедливым, это внешняя зависимость, вы не должны вставлять ее в свой код в любом случае, так как это значительно упростит отслеживание ошибок. Сохраняя ее раздельность - по крайней мере, для сборки, даже если она не для распространения, значительно увеличит вашу жизнь проще.)