ビルドライブラリからexeまたはdllに切り替える未解決の外部シンボルエラー
-
03-07-2019 - |
質問
ライブラリとしてアプリケーションを構築していますが、必要な出力を確実に取得できるようにするために、それを切り替えてexeを生成します。すぐに、未解決の外部シンボルに関するエラーがいくつか発生しました。
最初は、参照しているサードパーティライブラリへのパスが設定されていないと思ったので、フォルダーをパス変数に追加し、インクルード、参照、ソースファイルに追加しました。すべてのパスがあることを確認します。
引き続きエラーが表示されます:
エラーLNK2019:未解決の外部 シンボル" __ declspec(dllimport)public: 静的ボイド __cdecl xercesc_2_8 :: XMLPlatformUtils :: Initialize(char const * const、char const * const、class xercesc_2_8 :: PanicHandler * const、class xercesc_2_8 :: MemoryManager * const、bool)" (__imp_?Initialize @ XMLPlatformUtils @ xercesc_2_8 @@ SAXQBD0QAVPanicHandler @ 2 @ QAVMemoryManager @ 2 @ _N @ Z) 関数" void __cdeclで参照されています xsd :: cxx :: xml :: initialize(void)" (?initialize @ xml @ cxx @ xsd @@ YAXXZ)
ここで質問している理由は、Visual Studioでライブラリとしてビルドしたとき、これらのエラーは発生しませんでしたが、dllとexeとしては発生するからです。
ご意見はありますか?
解決
ライブラリを構築する場合、リンカーはインポートされたシンボルを解決する必要はありません。これは、オブジェクトファイルとライブラリのリンクを開始したときにのみ発生します。
だからこそ、実行可能ファイルをビルドするときにエラーが表示されるようになったのです。
実際、VC2008(および、よく覚えている場合は2005)では、プロジェクトプロパティを使用します->リンカー->入力->追加の依存関係。必要なライブラリはスペースで区切る必要があります(奇数、ちょっと?)
幸運!
他のヒント
また、特にそのライブラリに対してリンクすることを指定する必要があります。リンクパスは、検索するデータではなく、検索する必要があるデータの場所をリンカに伝えるだけです。また、問題のライブラリに対してリンクしていることを指定する必要があります(xerces?)。
残念ながら、MSVCでこれを指定する方法はわかりませんが、おそらく「リンカーオプション」の下にあります。
@copproが言ったように、そのライブラリとリンクすることを指定する必要があります。 EXEまたはDLLをビルドすると、リンカーが実行され、使用しているすべての関数を見つける必要がありますが、ライブラリをビルドするには、ライブラリアンが実行され、すべての関数参照を解決する必要はありません(ただし、そのライブラリをEXEで使用する場合は、再度行う必要があります)。
そのため、プロジェクトのオプション、リンカーオプション、入力に移動し、追加のライブラリパスの下に不足している関数(xerces.lib?)を定義するライブラリをリストします。 [追加のライブラリパス]の下に場所を追加する必要がある場合があります。