2009-05-11 42 views
13

私はこのMFCアプリケーションに、組み込みのデータベースを必要としています。だから私はそれのための滑らかで、速い "embeddable"データベースを狩りに行って、SQLiteを渡り歩きました。"エラーLNK2019:未解決の外部シンボル"を解決するにはどうすればよいですか?

私はそれを使ってDBを作成し、Visual Studio 2008でスタティックライブラリプロジェクトを作成しました。ライブラリプロジェクトは別のメインプロジェクトで使用されます。

ライブラリプロジェクトでは、AddFeedToDB(CFeed f)というメソッドでクラスDBClassを作成しました。ライブラリプロジェクトでは、codeproject(cppsqlite3.lib)の.libファイルが使用されます。

静的ライブラリをコンパイルする場合、誤りが検出されなかったが、私はメインプロジェクトにライブラリプロジェクトファイルを使用しようとすると、私はエラーのこれらの種類を取得:

error LNK2019: unresolved external symbol "public:void __thiscall 
    CppSQLite3DB::close(void)" ([email protected]@@QAEXXZ 
    referenced in function "public: int __thiscall 
    CTalkingFeedsDB::AddFeedToDB(class CFeed,char const*)" (? 
    [email protected]@@[email protected]@[email protected] 

は、私が何をしないのですか?

答えて

9

それは私が実際のシンボルが__impXXX(すなわち[email protected]@@QAEXXZ)であったシンボルXXX(すなわち[email protected]@@QAEXXZは、輸入libにだと思ったことを何度も私以上に起こりました。

リンカエラーの理由は、コンパイル手順で発見される、その後です:それは[email protected]@@QAEXXZを生成する必要がどこコンパイラは、インポートする[email protected]@@QAEXXZシンボルを生成します。これは、関数宣言自体に__declspec(dllimport)が含まれていないことを意味します。一部のプリプロセッサシンボルが定義されていないために発生する可能性があります。または__declspecがまったく存在しません...

+0

これは所定の質問に答えますか? – ST3

+0

@ ST3:明らかに、この特殊なケースを解決しました。リンカのエラーを解決するための一般的なレシピではありません。 – xtofl

+0

はい、この行を追加すると、私の(同様の)問題も解決されました。実際に起こっているのは、エクスポートされていない別のDLL(通常はMSVS)で定義されたシンボルが必要なプロジェクトがあることです。 –

1

実行可能ファイルにcodeproject SQLite libをリンクするか、プロジェクトに直接ソースファイルを含める必要があります。 (どちらあなたがやったの?)

+2

ライブラリプロジェクトでは、プロジェクト - >プロパティ - >構成プロパティ - >ライブラリアン - >一般 - >追加の依存関係に行き、 ".. \ SQLiteCommon \ sqlite3.lib"を追加しました。 – Attilah

+0

静的にリンクしましたか(コンパイルしたとき)? – MickaelFM

+0

はい、静的にリンクしています。しかし、変わったのは、他のプロジェクトタイプと同じように、Project Properties-> ConfigurationプロパティでLinkerタブが表示されないのですが、代わりにLibrarianが表示されます。 – Attilah

1

私は次の手順に従います:

  1. を使用すると、シンボルがによってエクスポートされることを期待するもののライブラリまたは.objファイルのファイルについて考えます。

  2. 実際にそれがであるかどうかを確認してください。その記号を(文字で確認してください)エクスポートしてください。場合によっては、呼び出し規約が異なります。

  3. シンボルを含める予定のライブラリがリンカに認識されているかどうかを確認します(最初に「追加ライブラリ」を確認してから、ライブラリが実際に見つかったかどうかを確認します) 、とlibファイルを開くためにLINK.EXEを探してください。)

しばらく考えた後、あなたはあなたのライブラリプロジェクトがが機能するために求めて輸出しないことかもしれません。その関数はデータベースlibにあります。そのlibをメインプロジェクトに追加する必要があります。それはあなたの静的なlibプロジェクトにそれを追加するための使用です。

+0

lib(sqlite.lib)はシンボルをエクスポートしません。 私のメインプロジェクトにlibを追加しましたが、まだ動作しません。私はまだ同じエラーが発生します。 – Attilah

1

コンパイラとリンカーは、ライブラリが別のライブラリにリンクされることはありません(DLLが1つの場合を除きます)。メインプロジェクトでは、両方のライブラリ(cppsqlite3.libと独自の静的ライブラリ)を指定する必要があります。

4

あなたのケースであるかどうかわかりませんが、imp接頭辞は、Win32プロジェクトでx64ライブラリをコンパイルしている可能性があります。

15

私は既にこの質問から2年が経過していることを知っています...しかし、私はここで同じ状況で走っています。すべてのヘッダーファイルを追加しました。libディレクトリを追加しました。このエラーが発生しています。 私はlibを手動で構成プロパティ - >リンカ - >入力 - >付随依存関係 に追加してくれました。

+0

偉大なおかげで、リンカのエラーは依存性によるものです –

関連する問題