web-dev-qa-db-ja.com

「エラーLNK2019:未解決の外部シンボル」を解決するにはどうすればよいですか?

私が取り組んでいるこのMFCアプリケーションは、組み込みデータベースが必要です。それで、私はそのための滑らかで高速な「埋め込み可能な」データベースを探しに行き、SQLiteに出くわしました。

それを使用してDBを作成し、Visual Studio 2008を使用して静的ライブラリプロジェクトを作成しました。ライブラリプロジェクトは別のメインプロジェクトで使用されます。

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

スタティックライブラリをコンパイルしてもエラーは検出されませんが、メインプロジェクトでライブラリプロジェクトファイルを使用しようとすると、次のタイプのエラーが発生します。

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

何が欠けていますか?

13
Attilah

シンボルXXX(つまり?close@CppSQLite3DB@@QAEXXZがインポートライブラリでだったのに、実際のシンボルが__impXXX(つまり__imp?close@CppSQLite3DB@@QAEXXZ)であると思ったのは2回以上ありました。

リンカーエラーの理由は、コンパイルステップで見つかります。コンパイラーは、インポートする?close@CppSQLite3DB@@QAEXXZシンボルを生成します。ここで、__imp?close@CppSQLite3DB@@QAEXXZを生成する必要があります。これは、関数宣言自体に__declspec( dllimport )がないことを意味します。定義されていないプリプロセッサシンボルが原因である可能性があります。または、__declspecがまったく存在しない...

9
xtofl

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

15
Luis Eduardo

それがあなたのケースであるかどうかはわかりませんが、impプレフィックスは、Win32プロジェクトでx64ライブラリをコンパイルしていることを意味する場合があります。

5
Ago

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

1
MickaelFM

私はこれらのステップに従います:

  1. シンボルのエクスポートに使用するライブラリまたは.objファイルについて考えてください。

  2. doesがまさにそのシンボルをエクスポートするかどうかを確認します(文字ごとに確認します)。時々、それは呼び出し規約が異なります。

  3. シンボルを含むと予想されるライブラリがリンカーに知られているかどうかを確認します-最初に「追加のライブラリ」を確認してから、ライブラリが実際に見つかるかどうかを確認します(主にsysinternalsのfilemon.exeを使用してこれを行い、リンクを探します) libファイルを開くための.exe。)

しばらく考えてみると、ライブラリプロジェクトが求める機能をエクスポートするnotであることがわかるかもしれません。その関数はデータベースlibにあります。そのlibをメインプロジェクトに追加する必要があります。静的libプロジェクトに追加しても無駄です。

1
xtofl

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

1
Mark Ransom