0

プロジェクトに SQLite Amalgamation を追加しようとしています。彼らのページによると、私は「合併をソース ディレクトリにコピーし、プロジェクト内の他の C コード ファイルと一緒にコンパイルするだけです。」sqlite3.h もコピーしたので、API にアクセスできます。

ただし、API への関数呼び出しは次のようになります。

sqlite3 *db;
int rc;

rc = sqlite3_open("test.db", &db);

次のエラーが発生します。

無効な引数 '
候補は次のとおりです:
int sqlite3_open(const char *, * *) '

DataSettings.cpp
/FCS/src
行 24
セマンティック エラー

ここで何が間違っていますか?何を設定するのを怠ったのですか?

4

1 に答える 1

2

この問題には、名前マングリングの不一致の特徴があります。C++ では、引数の型に基づいて関数をオーバーロードできるため、C++ コンパイラは、引数の型をエンコードするために、オブジェクト コードに出力する関数名を「マングル」する必要があります。C コンパイラはこれを行いません。関数に「C」リンケージがあることを C++ コンパイラに指定すると、その関数名の名前マングリングとオーバーロードが無効になります。これが何をするかextern "C"です。

C は多くの点で C++ のサブセットに似ていますが、この 2 つは異なる言語です。C コードは C コンパイラでコンパイルすることをお勧めします。したがって、別の方法の 1 つは、SQLite 融合の C ソースを C++ コードとは別に、たとえばライブラリにビルドし、それを C++ オブジェクト ファイルとリンクして、最終的な実行可能ファイルを生成することです。

于 2014-12-12T19:16:04.010 に答える