0

暗黙的なリンクを使用して DLL を介して公開される SQLite のラッパー クラスを作成する実験を行っています。つまり、消費者がコンパイルしてリンクするためのライブラリ ファイルとヘッダー ファイルを作成します。

現在、ラッパー クラスをエクスポートしていますが、このラッパー クラスを使用するプロジェクトをコンパイルしようとすると、sqlite API 呼び出し (sqlite3_open など) を解決できないというリンカー エラーが発生します。ラッパー クラスとコンシューマは両方とも C++ ですが、sqlite は C です。

消費者は、公開されていない関数について知る必要があるのはなぜですか (ラッパー クラスの要点)? これは、SQLite ヘッダーを変更してその関数を変更し、すべての関数/ラップしている関数に適切な _declspec(dllexport) 装飾を持たせる必要があるということですか? この変更に代わるものはありますか?

リンカー エラー:

libsqlite.lib(sqlitewrapper.oxl) : error LNK2019: unresolved external symbol _sq
lite3_close referenced in function "public: virtual __thiscall CSQLiteWrapper::~
CSQLiteWrapper(void)" (??1CSQLiteWrapper@@UAE@XZ)

libsqlite.lib(sqlitewrapper.oxl) : error LNK2019: unresolved external symbol _sq
lite3_open referenced in function "public: __thiscall CSQLiteWrapper::CSQLiteWra
pper(class ATL::CStringT<char,class ATL::StrTraitATL<char,class ATL::ChTraitsCRT
<char> > > const &)" (??0CSQLiteWrapper@@QAE@ABV?$CStringT@DV?$StrTraitATL@DV?$C
hTraitsCRT@D@ATL@@@ATL@@@ATL@@@Z)

libsqlite.lib(sqlitewrapper.oxl) : error LNK2019: unresolved external symbol _sq
lite3_free referenced in function "public: virtual void __thiscall CSQLiteWrappe
r::Exec(class ATL::CStringT<char,class ATL::StrTraitATL<char,class ATL::ChTraits
CRT<char> > > const &,int (__cdecl*)(void *,int,char * *,char * *))" (?Exec@CSQL
iteWrapper@@UAEXABV?$CStringT@DV?$StrTraitATL@DV?$ChTraitsCRT@D@ATL@@@ATL@@@ATL@
@P6AHPAXHPAPAD2@Z@Z)

libsqlite.lib(sqlitewrapper.oxl) : error LNK2019: unresolved external symbol _sq
lite3_exec referenced in function "public: virtual void __thiscall CSQLiteWrappe
r::Exec(class ATL::CStringT<char,class ATL::StrTraitATL<char,class ATL::ChTraits
CRT<char> > > const &,int (__cdecl*)(void *,int,char * *,char * *))" (?Exec@CSQL
iteWrapper@@UAEXABV?$CStringT@DV?$StrTraitATL@DV?$ChTraitsCRT@D@ATL@@@ATL@@@ATL@
@P6AHPAXHPAPAD2@Z@Z)
4

2 に答える 2

2

ラッパーを SQLite ライブラリに対して静的にリンクしましたか? これを行うと、ライブラリが単なるゲートウェイではなく、すべてがライブラリ内に存在することになるため、リンカー エラーは解消されます。もちろん、SQLiteライブラリをラッパーから分離したくないと仮定しています。

于 2012-05-16T03:43:28.270 に答える
1

私の問題の根本的な原因は、「lib」コマンドを使用して、リンク先のライブラリを生成していたことです。Ixop が言及しているように、その場合、DLL で直接公開されていなくても、SQLite がライブラリに追加されていることを確認する必要があります。

ただし、暗黙的なリンクでは、代わりにIMPLIBリンカー ディレクティブを使用してライブラリを生成する必要がありました。ビルド方法にこの変更を加えることで、問題が修正されました。

于 2012-05-16T22:51:47.710 に答える