質問

複数のプロジェクトを使用したソリューションがあります。 「メイン」がありますプロジェクトはメニューとして機能し、そこからユーザーは他のプロジェクトにアクセスできます。このメインプロジェクトでは、呼び出されるすべての関数に対してリンカーエラーが発生します。これらのリンカーエラーを回避するにはどうすればよいですか? 「プロジェクトの依存関係...」でプロジェクトの依存関係を既に設定しています。ダイアログ。

ありがとう

編集-提案どおりに実行し、出力フォルダーをリンカーの追加ディレクトリに追加しました。ただし、今では次のように100万のエラーが発生しています。

3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_ios >::setstate(int,bool)" (?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXH_N@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::ios_base::width(int)" (?width@ios_base@std@@QAEHH@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::basic_streambuf >::sputn(char const *,int)" (?sputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHPBDH@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: static bool __cdecl std::char_traits::eq_int_type(int const &,int const &)" (?eq_int_type@?$char_traits@D@std@@SA_NABH0@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: static int __cdecl std::char_traits::eof(void)" (?eof@?$char_traits@D@std@@SAHXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::basic_streambuf >::sputc(char)" (?sputc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHD@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::basic_streambuf > * __thiscall std::basic_ios >::rdbuf(void)const " (?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_streambuf@DU?$char_traits@D@std@@@2@XZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: char __thiscall std::basic_ios >::fill(void)const " (?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEDXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::ios_base::flags(void)const " (?flags@ios_base@std@@QBEHXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::ios_base::width(void)const " (?width@ios_base@std@@QBEHXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: static unsigned int __cdecl std::char_traits::length(char const *)" (?length@?$char_traits@D@std@@SAIPBD@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::basic_ostream > & __thiscall std::basic_ostream >::flush(void)" (?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@XZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::basic_ostream > * __thiscall std::basic_ios >::tie(void)const " (?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_ostream@DU?$char_traits@D@std@@@2@XZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: bool __thiscall std::ios_base::good(void)const " (?good@ios_base@std@@QBE_NXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_ostream >::_Osfx(void)" (?_Osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEXXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_streambuf >::_Lock(void)" (?_Lock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEXXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_streambuf >::_Unlock(void)" (?_Unlock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEXXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::locale::facet * __thiscall std::locale::facet::_Decref(void)" (?_Decref@facet@locale@std@@QAEPAV123@XZ) already defined in panels.lib(panel_main.obj)
3>libcpmtd.lib(ios.obj) : error LNK2005: "private: static void __cdecl std::ios_base::_Ios_base_dtor(class std::ios_base *)" (?_Ios_base_dtor@ios_base@std@@CAXPAV12@@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(ios.obj) : error LNK2005: "public: static void __cdecl std::ios_base::_Addstd(class std::ios_base *)" (?_Addstd@ios_base@std@@SAXPAV12@@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "void __cdecl _AtModuleExit(void (__cdecl*)(void))" (?_AtModuleExit@@YAXP6AXXZ@Z) already defined in msvcprtd.lib(locale0_implib.obj)
3>libcpmtd.lib(locale0.obj) : error LNK2005: __Fac_tidy already defined in msvcprtd.lib(locale0_implib.obj)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "private: static void __cdecl std::locale::facet::facet_Register(class std::locale::facet *)" (?facet_Register@facet@locale@std@@CAXPAV123@@Z) already defined in msvcprtd.lib(locale0_implib.obj)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "private: static class std::locale::_Locimp * __cdecl std::locale::_Getgloballocale(void)" (?_Getgloballocale@locale@std@@CAPAV_Locimp@12@XZ) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "private: static class std::locale::_Locimp * __cdecl std::locale::_Init(void)" (?_Init@locale@std@@CAPAV_Locimp@12@XZ) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "public: static void __cdecl std::_Locinfo::_Locinfo_ctor(class std::_Locinfo *,class std::basic_string,class std::allocator > const &)" (?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "public: static void __cdecl std::_Locinfo::_Locinfo_dtor(class std::_Locinfo *)" (?_Locinfo_dtor@_Locinfo@std@@SAXPAV12@@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(xlock.obj) : error LNK2005: "public: __thiscall std::_Lockit::_Lockit(int)" (??0_Lockit@std@@QAE@H@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(xlock.obj) : error LNK2005: "public: __thiscall std::_Lockit::~_Lockit(void)" (??1_Lockit@std@@QAE@XZ) already defined in msvcprtd.lib(MSVCP90D.dll)
役に立ちましたか?

解決

ソリューションに関する他の詳細を知ることなく、それを伝えることは困難ですが、すべてを再構築することが役立つ場合があります。この状況は、異なるアーキテクチャの混合オブジェクトファイルがある場合に発生することがあります。

「参照」の使用を検討することもできます。 「依存関係」の代わりに

編集:

投稿した後、標準ライブラリへのリンクが一貫していないようです。プロジェクトの1つが標準ライブラリを静的にリンクし、他のプロジェクトが動的にリンクするのでしょうか? (プロジェクトのプロパティを参照してください->リンカー)またはリリースランタイムに1つ、デバッグに他のもの? (ただし、最後のものは可能ですが、注意が必要です)

他のヒント

ソリューションに関するすべての詳細を知らずに答えることは困難ですが、あなたの「その他」を想定します。プロジェクトは.libファイルを生成するように設定され、メインプロジェクトはこれらすべてのlibファイルをリンクします。その場合、エラーの原因として考えられるのは、プロジェクトがランタイムライブラリの異なるバージョンにリンクしていることです。

Microsoftのドキュメントから、 "リンカーの特定の呼び出しに渡されるすべてのモジュールは、同じランタイムライブラリコンパイラオプション(/ MD、/ MT、/ LD)でコンパイルされている必要があります。

すべてのプロジェクトを変更して、同じバージョンのランタイムライブラリを使用するようにしてください。 Visual Studio 2010では、これはプロジェクトのプロパティにあります|構成プロパティ| C / C ++ |コード生成|ランタイムライブラリ。 マルチスレッドデバッグDLL またはマルチスレッドデバッグ(デバッグ構成用)を選択します。

他のプロジェクトの関数はエクスポートされていますか?それらがエクスポートされない場合、メインexeからリンクするものが何もないため、エラーが発生します。 __declspec(export)を使用してDLLからエクスポート詳細については。

発生しているエラーは「エラーLNK2005」で、リンクしているライブラリ(msvcprtd.lib)のシンボルが別のライブラリ(panels.libなど)で既に定義されています。 panels.libを「特定のライブラリを無視」フィールドに追加すると(VS2008構成プロパティ->;リンカ->>入力->特定のライブラリを無視)、エラーが停止します。

取得しているリンカーエラーは、「未解決のシンボル」に関するものだと思いますか?

静的ライブラリ(つまり、.libファイル)を使用する場合、リンカ時にシンボルをリンクできるように、ライブラリをリンカ入力に追加する必要があります。これを行わないと、未解決のシンボルが表示されます:

  1. プロジェクトを右クリックして、[プロパティ]を選択します。
  2. 構成プロパティの選択->リンカー->入力
  3. 追加の依存関係にライブラリ名(たとえば、filename.lib)を入力します。

これと非常によく似た問題がありました。これは、ライブラリの1つにオプション 'Treat wchar_t as built-in type'が他とは異なる値に設定されていたことが原因でした。新しいプロジェクトでは、この設定はデフォルトでfalseです。それらをすべてtrueに変更すると、問題が修正されました。

正確には、少なくとも1つのプロジェクトが異なる「ランタイムライブラリ」でコンパイルされます。その後、他の。たぶん、異なるデフォルトを使用して新しいものを追加したかもしれません。 「構成プロパティ」の値が等しいかどうか、プロジェクトのプロパティを確認してください。 -> " C / C ++" -> "コード生成" -> "ランタイムライブラリ"。

私の場合、問題は、関数プロトタイプ、クラス定義、関数実装、およびクラス実装を単一のcppファイルに保持していたためです。これらのエラーは、宣言とプロトタイプを別のヘッダーファイルに移動したときにのみ消えました。本当に変です!

私の場合、2つの方法があります:

  1. プロジェクトのプロパティ-> C / C ++->コード生成->ランタイムライブラリ。 MTに変更します。

  2. 不足ライブラリを以下に追加します:リンカー->入力->追加の依存関係。機能しない場合は、ライブラリ名の代わりにフルパスを追加してください。

例:C:\ Program Files(x86)\ Microsoft Visual Studio 14.0 \ VC \ lib \ amd64 \ libvcruntime.lib;

それは私のために働いています。誰にもこの質問に答えてください助けが必要です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top