4

私は Eclipse の C++ プロジェクトで sqlite3 を使用しようとしていますが、API の使用に関する多くのアドバイスをオンラインで見つけましたが、残念ながら以前のハードルに落ちています。これは、C/C++ と CDT の経験が不足しているためだと思います。sqlite3.c と sqlite3.h をプロジェクトのソース フォルダーにコピーしただけで、テスト方法は次のようになります。

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 フォーラムに投稿したほうがよい場合は、お知らせください。

4

2 に答える 2

1

SQLite はCで書かれており、C と C++ の間には多くの違いがあります。巨大な数ではありませんが、それらは間違いなく同じではなく、どちらも他のスーパーセットではありません. 単一の Eclipse プロジェクトを使用しているため、C コードを C++ コンパイラーでコンパイルしようとして、これらの小さな違いに行き詰まっている可能性があります。

sqlite3.c を C プロジェクトとして別のライブラリ (静的ライブラリまたは動的ライブラリにすることができます) にビルドし、C++ プロジェクトでその C プロジェクトを依存関係として使用するようにすることをお勧めします。または、一度ビルドして、外部依存関係として持つこともできます。それもうまくいきます。(公平を期すために、これは外部依存関係です。バグ修正の追跡が難しくなるため、とにかくコードに大規模に埋め込むべきではありません。配布用でなくても、少なくともビルド用に分離しておくと、あなたの人生が大きく変わりますより簡単に。)

于 2013-12-11T12:36:13.707 に答える
1

このようにしてみましたか?(ダブルポインター付き):

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

Linuxで作業していると思います。
もう 1 つの方法は、スクリプトを実行することです。

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

ファイル connectDB は次のようになります。

#!/bin/bash
sqlite3 test.db "select * from test.table" 
于 2013-12-11T11:42:36.420 に答える